RHEL4-SFTP配置

RHEL4-SFTP配置手册

目标:
在RHEL4上面配置SFTP服务器,实现用户SFTP登录,禁止SSH登录,并实现目录锁定,避免用户登录后跳出自己的HOME目录。

为达到以上功能,RHEL4自带openssh版本无法实现目录锁定,需要下载openssh 4.8p1以上版本!

1)软件下载
从http://download.chinaunix.net/下载zlib:
zlib-1.2.7.tar.gz
# ls -l zlib-1.2.7.tar.gz
-rw-r--r--  1 root root 560351 Jul 26 09:59 zlib-1.2.7.tar.gz

从http://www.openssh.com/下载openssh:
openssh-4.9p1.tar.gz
# ls -l openssh-4.9p1.tar.gz
-rw-r--r--  1 root root 1011434 Jul 26 09:56 openssh-4.9p1.tar.gz
说明:openssh-4.9p1需要zlib 1.2.3及以上版本,否则安装会报以下错误:
configure: error: *** zlib too old - check config.log ***
...
If you are in doubt, upgrade zlib to version 1.2.3 or greater.

2)软件安装
为避免与默认安装的SSH冲突,我们安装到自定义的目录。
安装ZLIB:
# tar -zxvf zlib-1.2.7.tar.gz
# cd zlib-1.2.7
# ./configure --prefix /usr/local/zlib
# make
# make install

安装OPENSSH:
# tar zxvf openssh-4.9p1.tar.gz
# cd openssh-4.9p1
# ./configure --prefix /usr/local/openssh --with-zlib=/usr/local/zlib
# make
# make install

3)配置并启动服务
为避免与默认安装的SSH冲突,修改监听端口为2222:
# vi /usr/local/openssh/etc/sshd_config
-----------
Port 2222
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
-----------
添加锁定目录的配置:
# vi /usr/local/openssh/etc/sshd_config
-----------
# override default of no subsystems
#Subsystem      sftp    /usr/local/openssh/libexec/sftp-server
Subsystem       sftp    internal-sftp

# Example of overriding settings on a per-user basis
#Match User anoncvs   # 匹配单个用户
#       X11Forwarding no
#       AllowTcpForwarding no
#       ForceCommand cvs server
Match group sftponly   # 匹配sftponly组的所有用户。解释一下:当sshd匹配到sftponly组中的用户,就会强制使用sftp(ForceCommand的作用),并将用户限定在/sftphome/下相应用户的目录下(ChrootDirectory的作用)。
ChrootDirectory %h   # 锁定目录为用户的home目录
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp  # 强制使用sftp,不能使用ssh
-----------

启动ssh服务:
# /usr/local/openssh/sbin/sshd &
此时可以看到2222端口已经监听:
# netstat -tnlp |grep 2222
tcp        0      0 0.0.0.0:2222                  0.0.0.0:*                   LISTEN      7180/sshd            
tcp        0      0 :::2222                       :::*                        LISTEN      7180/sshd   

4)用户创建及权限调整
创建组:
# groupadd -g 801 sftponly
创建用户:
# useradd -d /opt/sftp/sftpuser01 -s /sbin/nologin -g sftponly sftpuser01
# passwd sftpuser01
此时用户使用sftp登录时,messages日志会报以下错误,说明用户认证通过,chroot失败:
sshd[6944]: Accepted password for sftpuser01 from 192.168.164.30 port 2347 ssh2
sshd[6946]: fatal: bad ownership or modes for chroot directory "/opt/sftp/sftpuser01"

因为如果要chroot,则需要将home目录的owner修改为root,如下:
# ls -ld /opt/sftp/sftpuser01/
drwx------  3 sftpuser01 sftponly 4096 Jul 26 10:14 /opt/sftp/sftpuser01/
# chown root /opt/sftp/sftpuser01/
# ls -ld /opt/sftp/sftpuser01/
drwx------  3 root sftponly 4096 Jul 26 10:15 /opt/sftp/sftpuser01/

此时用户使用sftp登录时,messages日志会报以下错误,因为home目录的组权限为空:
Could not chdir to home directory /opt/sftp/sftpuser01: Permission denied

# chmod 755 /opt/sftp/sftpuser01/
# ls -ld /opt/sftp/sftpuser01/
drwxr-xr-x  3 root sftponly 4096 Jul 26 10:17 /opt/sftp/sftpuser01/

OK,现在用户就可以正常sftp登录了,不过从以上目录权限发现一个问题是,用户是不能在home目录下写文件的!
所以我们是否可以把home目录权限设置为775呢?试过之后发现认证通过,登录还是失败,messages日志报错如下:
Accepted password for sftpuser01 from 192.168.164.30 port 2963 ssh2
fatal: bad ownership or modes for chroot directory "/opt/sftp/sftpuser01"

显然还是权限的问题!

看来,我们只能在home目录下再创建一个目录,比如data:
# mkdir /opt/sftp/sftpuser01/data
# chown sftpuser01:sftponly /opt/sftp/sftpuser01/data
这样,sftp用户登录后,就可以在data目录下进行读写操作了。

5)切换SSH服务
最终,我们需要把系统自带SSH服务停掉,将新SSH的端口修改为默认22,并启动新的SSH服务。
如果机器是远程,使用SecureCRT登录后,可以把原SSH服务停掉(此时连接不会中断,我用的SecureCRT5.1.3),关闭开机自启动。再启动新SSH服务,并加入/etc/rc.local,实现开机自启动。具体操作如下:
# vi /usr/local/openssh/etc/sshd_config
-----------
Port 2222
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
-----------
# /etc/init.d/sshd stop   #如果没有正常关闭,就kill进程
chkconfig sshd off
# chkconfig sshd --list
sshd            0:off   1:off   2:off    3:off    4:off    5:off    6:off
# /usr/local/openssh/sbin/sshd &
# netstat -tnlp |grep 22
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      7399/sshd              
tcp        0      0 :::22                       :::*                        LISTEN      7399/sshd

# echo -e "#start sshd\n/usr/local/openssh/sbin/sshd &" >>/etc/rc.local
# cat /etc/rc.local
-----------
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
#start sshd
/usr/local/openssh/sbin/sshd &
-----------

本文出自 “Charles的博客” 博客,转载请与作者联系!

你可能感兴趣的:(配置,目录,用户登录)