第一次带着selinux配置服务器,没想到还真是劳神。公司的服务器都从路由上做了屏蔽,selinux从安装就关闭了,平时做实验的时候,为了省事也都permissive掉了。今天做ftp时,带了enforcing的selinux,顺便复习一下selinux的知识。
以下内容均以Centos 5.4(Final)版作为实验环境,命令和屏显均为原始数据(有删减)。才疏学浅,如果纰漏请留言指教!
1.安装
[root@localhost CentOS]# rpm -ivh vsftpd-2.0.5-16.el5.i386.rpm
warning: vsftpd-2.0.5-16.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
Preparing… ########################################### [100%]
1:vsftpd ########################################### [100%]
yum等同理
2.配置
2.1配置文件
[root@localhost CentOS]# vim /etc/vsftpd/vsftpd.conf
#anonymous_enable=YES
#匿名访问,YES为可以,我们把它注释掉
local_enable=YES
#本地用户登陆,YES为可以,(缺省)
write_enable=YES
#上传文件(建立文件夹),YES为可以,(缺省)
local_umask=022
#本地用户上传文件umask,002,(缺省)
#anon_upload_enable=YES
#匿名用户上传,YES为可以,(缺省)
#anon_mkdir_write_enable=YES
#匿名用户建立文件夹,YES为可以,(缺省)
dirmessage_enable=YES
#文件夹通知,YES为可以,(缺省)
xferlog_enable=YES
#xfer日志,YES为可以,(缺省)
connect_from_port_20=YES
#数据传输端口号,20,(缺省)
#chown_uploads=YES
#修改上传文件权限,YES为可以,(缺省)
#chown_username=whoever
修改上传文件所属用户为whoever,(缺省)
#xferlog_file=/var/log/xferlog
#xferlog文件位置,/var/log/xferlog,(缺省)
xferlog_std_format=YES
#xferlog标准输出,YES为可以,(缺省)
#idle_session_timeout=600
#会话超时600s,(缺省)
#data_connection_timeout=120
#数据传输超时120s,(缺省)
#nopriv_user=ftpsecure
#vsftpd服务执行者,ftpsecure,(缺省)
#async_abor_enable=YES
#允许运行特殊的ftp命令async ABOR,YES为可以,(缺省)
#ascii_upload_enable=YES
#ascii方式上传,YES为可以,(缺省)
#ascii_download_enable=YES
#ascii方式下载,YES为可以,(缺省)
#ftpd_banner=Welcome to blah FTP service.
#ftpd登陆的横幅
#deny_email_enable=YES
#拒绝email登陆,YES为可以,(缺省)
#banned_email_file=/etc/vsftpd/banned_emails
#拒绝的email列表位置,(缺省)
chroot_local_user=YES
#易错,限制用户在家目录,YES为可以,(手动添加)
#chroot_list_enable=YES
#易错,vsftpd读取一个提供了用户名的文件,YES为可以,(缺省)
#读取用户的结果,由chroot_local_user决定,且与其相反。
#chroot_list_file=/etc/vsftpd/chroot_list
#chroot_list文件的位置
#ls_recurse_enable=YES
#使用ls -Rl 命令,因为这个指令会耗费大量系统资源,YES为可以,(缺省)
listen=YES
#监听,YES为可以,(缺省)
#listen_ipv6=YES
#监听ipv6,YES为可以,(缺省)
pam_service_name=vsftpd
#在pam中的名称,(缺省)
userlist_enable=YES
#使用usrlist阻止其中的用户,YES为可以,(缺省)
tcp_wrappers=YES
#使用TCP wrappers,YES为可以,(缺省)
其他默认配置文件中没有列出的:
anon_max_rate=30000
#给匿名用户最高下载速率
max_clients=50
#最大连接数
max_per_ip=5
#每ip最大连接数
2.2建立FTP用户
我们单纯的建立登陆ftp的账户。
[root@localhost CentOS]# useradd -g ftp -s /sbin/nologin ftp001
[root@localhost CentOS]# passwd ftp001
Changing password for user ftp001.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
2.3防火墙配置
如果我们单纯的给内网用户域 192.168.1.0/24开放ftp
[root@localhost CentOS]# iptables -F
[root@localhost CentOS]# iptables -A INPUT -p tcp –dport 20 -s 192.168.1.0/24 -j ACCEPT
[root@localhost CentOS]# iptables -A INPUT -p tcp –dport 21 -s 192.168.1.0/24 -j ACCEPT
[root@localhost CentOS]# iptables -A INPUT -p udp –dport 21 -s 192.168.1.0/24 -j ACCEPT
[root@localhost CentOS]# iptables -A INPUT -p udp –dport 20 -s 192.168.1.0/24 -j ACCEPT
注:下面的命令将使远程控制掉线
[root@localhost CentOS]# iptables -A INPUT -j DROP
2.4selinux配置
本应该和上面的写在一起的。不过这里出错较多,放在下面一节排错中。
3.调试
启动服务:
[root@localhost ~]# service vsftpd start
为 vsftpd 启动 vsftpd: [确定]
客户端登陆,这里用windows xp自带的cmd
C:\Documents and Settings\Administrator>ftp 192.168.1.106
Connected to 192.168.1.106.
220 (vsFTPd 2.0.5)
User (192.168.1.106:(none)): ftp001
如果输入密码之前出错,说明账号不能登录或者没有创建,检查chroot_local_user
C:\Documents and Settings\Administrator>ftp 192.168.1.106
Connected to 192.168.1.106.
220 (vsFTPd 2.0.5)
User (192.168.1.106:(none)): ftp001
331 Please specify the password.
Password:
500 OOPS: chroot
(500 OOPS: child died)
Login failed.
出现500 OOPS: chroot,首先我们已经锁定了登陆在家目录,其次ftp001对家肯定有权限,这里就是selinux的问题。
我们利用tail –f 捕获audit.log如下:
type=USER_AUTH msg=audit(1285413832.612:63): user pid=7795 uid=0 auid=0 subj=root:system_r:ftpd_t:s0 msg=’PAM: authentication acct="ftp001" : exe="/usr/sbin/vsftpd" (hostname=192.168.1.102, addr=192.168.1.102, terminal=ftp res=success)’
type=USER_ACCT msg=audit(1285413832.640:64): user pid=7795 uid=0 auid=0 subj=root:system_r:ftpd_t:s0 msg=’PAM: accounting acct="ftp001" : exe="/usr/sbin/vsftpd" (hostname=192.168.1.102, addr=192.168.1.102, terminal=ftp res=success)’
type=CRED_ACQ msg=audit(1285413832.640:65): user pid=7795 uid=0 auid=0 subj=root:system_r:ftpd_t:s0 msg=’PAM: setcred acct="ftp001" : exe="/usr/sbin/vsftpd" (hostname=192.168.1.102, addr=192.168.1.102, terminal=ftp res=success)’
type=AVC msg=audit(1285413832.652:66): avc: denied { dac_override } for pid=7799 comm="vsftpd" capability=1 scontext=root:system_r:ftpd_t:s0 tcontext=root:system_r:ftpd_t:s0 tclass=capability
type=AVC msg=audit(1285413832.652:66): avc: denied { dac_read_search } for pid=7799 comm="vsftpd" capability=2 scontext=root:system_r:ftpd_t:s0 tcontext=root:system_r:ftpd_t:s0 tclass=capability
type=SYSCALL msg=audit(1285413832.652:66): arch=40000003 syscall=61 success=no exit=-13 a0=92ff36 a1=0 a2=9379ac a3=1 items=0 ppid=7795 pid=7799 auid=0 uid=0 gid=0 euid=0 suid=502 fsuid=0 egid=0 sgid=50 fsgid=0 tty=(none) ses=6 comm="vsftpd" exe="/usr/sbin/vsftpd" subj=root:system_r:ftpd_t:s0 key=(null)
前面是登陆成功提示,我们用audit2why分析黑体字,如下:
type=AVC msg=audit(1285413832.652:66): avc: denied { dac_override } for pid=7799 comm="vsftpd" capability=1 scontext=root:system_r:ftpd_t:s0 tcontext=root:system_r:ftpd_t:s0 tclass=capability
Was caused by:
Missing or disabled TE allow rule.
Allow rules may exist but be disabled by boolean settings; check boolean settings.
You can see the necessary allow rules by running audit2allow with this audit message as input.
我们得知check boolean settings,继续用audit2allow分析黑体字,如下:
#============= ftpd_t ==============
allow ftpd_t self:capability { dac_read_search dac_override };
得知ftp的一个布尔值被禁用,于是:
[root@localhost ~]# getsebool -a | grep ftp
allow_ftpd_anon_write –> off
allow_ftpd_full_access –> off
allow_ftpd_use_cifs –> off
allow_ftpd_use_nfs –> off
allow_tftp_anon_write –> off
ftp_home_dir –> off
ftpd_connect_db –> off
ftpd_disable_trans –> off
ftpd_is_daemon –> on
httpd_enable_ftp_server –> off
tftpd_disable_trans –> off
看样子应该是ftp_home_dir被off掉了
[root@localhost ~]# setsebool [-p] ftp_home_dir 1
其实在selinux报错的时候,我们就能想到是ftp相关的策略的问题,用audit2工具仅仅作处理流程。
然后重启vsftpd再试一下:
C:\Documents and Settings\Administrator>ftp 192.168.1.106
Connected to 192.168.1.106.
220 (vsFTPd 2.0.5)
User (192.168.1.106:(none)): ftp001
331 Please specify the password.
Password:
230 Login successful.
测试一下上传下载和建立文件夹:
ftp> put C:\boot.ini
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 File receive OK.
ftp: 发送 223 字节,用时 0.00Seconds 223000.00Kbytes/sec.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r–r– 1 502 50 223 Sep 25 11:52 boot.ini
226 Directory send OK.
ftp: 收到 66 字节,用时 0.00Seconds 66000.00Kbytes/sec.
ftp> mkdir 0test
257 "/0test" created
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 502 50 4096 Sep 25 11:52 0test
-rw-r–r– 1 502 50 223 Sep 25 11:52 boot.ini
226 Directory send OK.
ftp: 收到 129 字节,用时 0.00Seconds 129000.00Kbytes/sec.
ftp> get boot.ini
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for boot.ini (223 bytes).
226 File send OK.
ftp: 收到 223 字节,用时 0.00Seconds 223000.00Kbytes/sec.
ftp> disconnect
221 Goodbye.
一切正常。到此结束。




评论