FTP服务
vsftp,proftp
软件仓库:
[Server]
name=Server
baseurl=ftp://10.1.1.22/rhel5_source/Server
enabled=1
gpgcheck=0
协议: ftp/tcp
端口: 20,21
关闭:selinux
# setenforce 0
关闭:iptables
# service iptables stop
例子1:直接完成允许匿名访问ftp服务器
# yum install vsftpd -y
# service vsftpd start
# ftp 10.1.1.21
用户名ftp,密码随意,或者空
匿名登录之后,直接到了它的家目录/var/ftp,并且所有操作都锁定在该目录里
权限:默认只允许下载文件。不允许上传文件。
ftp> get fstab 《--下载文件
例子2:验证ftp的主动模式和被动模式
client <----> ftp
主动模式:
使用21端口进行控制命令传输,普通数据是ftp服务器主动使用20号端口连接客户端进行传输。
client ---控制指令----> ftp:21
client <-----普通数据传输---- ftp:20
传输数据的时候,是由服务器主动发起连接,第一个包又服务器产生。
client <---> [router] <---> ftp
10.1.1.20 10.1.1.1 210.38.2.3 210.38.2.4
适合场景:
客户端在内网,服务器在内网。
客户端
ftp> passive
Passive mode off. 《--被动模式被关闭,主动模式开启
ftp> ls
服务端
# netstat -ant | grep :20
tcp 0 0 10.1.1.21:20 10.1.1.22:16051 TIME_WAIT
^^^
被动模式:
使用21端口进行控制命令传输,服务器首先打开某个端口,然后客户端主动连接该端口,把数据要回来。
client ---控制指令----> ftp:21
client -----连接服务器,准备取回数据----> ftp:xxxx
连接成功之后
client <-----数据开始传输----- ftp:xxxx
使用场景:
客户端处于私有网络,可以访问互联网,然后ftp服务器必须是处于互联网。
客户端:
# telnet 10.1.1.21 21
Trying 10.1.1.21...
Connected to s22 (10.1.1.21).
Escape character is '^]'.
220 (vsFTPd 2.0.5)
USER ftp
331 Please specify the password.
PASS
230 Login successful.
PASV
227 Entering Passive Mode (10,1,1,21,121,222) <--服务已经在121*256+222的端口上进行监听,等待客户端主动连接上来获得数据
服务器:
# netstat -ntlp | grep $((121*256+222))
tcp 0 0 10.1.1.21:31198 0.0.0.0:* LISTEN 3032/vsftpd
客户端:
# nc -p 12345 10.1.1.21 31198 《--主动连接服务器的31198端口
服务端:
# netstat -an | grep $((121*256+222))
tcp 0 0 10.1.1.21:31198 0.0.0.0:* LISTEN
tcp 0 0 10.1.1.21:31198 10.1.1.22:12345 ESTABLISHED 《--连接已经建立,随时待命传输数据。
客户端:
LIST 《--列表
在nc指令的窗口可以看到列表结果
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
开启selinux
# vim /etc/sysconfig/selinux
SELINUX=enforcing
SELINUXTYPE=targeted
重启计算机
安全上下文
系统上的所有事物(普通文件,目录,命令,用户,运行的进程)的一切属性(身份,角色,类型或域)
Selinux的策略中定义了这些身份,角色,类型和域
身份:
selinux策略中定义,用于表明事物的身份。
例如:一个名字叫小明的人,小明就是这个人的身份。
角色:
用于表明事物的角色。
例如:一个叫小明的人,它的角色是男生。
类型或者域
类型针对目录、文件而已
域针对运行的进程而已
表明事物的操作范围。
例如: 一个叫小明的人,它的角色是男生,男生是可以进如男厕所。
# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t:SystemLow-SystemHigh
context=root:system_r:unconfined_t:SystemLow-SystemHigh
身份:角色:域/类型
# ls -lZ /etc/passwd
-rw-r--r-- root root system_u:object_r:etc_t /etc/passwd
身份:角色:类型
# ls -lZ /bin/touch
-rwxr-xr-x root root system_u:object_r:bin_t /bin/touch
策略:
targeted <---一般采用这个
strict
启动模式:
enforcing 强制 所有保护功能都有
permissive 允许 只会记录日志,不会采用真正的保护
disabled 禁用 关闭所有功能
临时改变它的运行模式:
# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive
查看selinux的审计日志
必须首先确认打开auditd服务
# sealert -a /var/log/audit/audit.log
图形界面:
# sealert -b /var/log/audit/audit.log
注意:为了支持图形界面,必须打开以下服务
messagebus
setroubleshoot
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
例子3:在打开selinux前提下,允许匿名帐号上传下载文件。
1、把selinux设定为permissive
2、设定vsftp
# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES <--增加该参数
write_enable=YES <--默认就有,确包存在
3、建立一个新目录,或者使用已经存在的目录,然后给予ftp匿名帐号可写的权限
# chmod 777 /var/ftp/pub
注意:
不能允许匿名帐号直接在ftp的根目录上传文件,只能在具有写权限的子目录上传文件。
4、测试
# service vsftpd restart
ftp> put /etc/hosts /pub/hosts # 保存到 /var/ftp/pub/hosts
5、查看selinux的审计日志,判断相关的操作是否违反策略,如果违反,就应该修改策略。
# sealert -a /var/log/audit/audit.log
.....
在允许访问:
如果应该允许让ftp后台写入这个目录,你需要开启allow_ftpd_anon_write布尔值
并且修改公共目录的文件上下文为public_content_rw_t。
阅读ftpd_selinux的man获得更多信息: "setsebool -P
allow_ftpd_anon_write=1; chcon -t public_content_rw_t "
以下命令将允许这个权限:
setsebool -P allow_ftpd_anon_write=1
....
目录原有安全上下文
# ls -ldZ /var/ftp/pub
drwxrwxrwx root root system_u:object_r:public_content_t /var/ftp/pub
public_content_t 《--公共的,可以被读访问的类型
public_content_rw_t 《--公共的,可以被读写访问的类型
1)修改策略,打开“允许匿名上传文件“的开关
查看
# 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
# setsebool -P allow_ftpd_anon_write=1
# getsebool -a | grep ftp
allow_ftpd_anon_write --> on 《---
# chcon -R -t public_content_rw_t /var/ftp/pub
恢复enforcing
# setenforce 1
例子4:允许匿名帐号下载自己上传的文件
删除自己上传的文件,新建目录等操作
anon_world_readable_only=NO
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
例子5:更改匿名帐号的ftp根目录
方法一:
修改ftp匿名帐号的家目录
方法二:
通过参数指定
# mkdir /ftp/pub
# chmod 777 /ftp/pub
# vim /etc/vsftpd/vsftpd.conf
anon_root=/ftp
# service vsftpd restart
# chcon -R -t public_content_t /ftp
# chcon -R -t public_content_rw_t /ftp/pub/
例子6:锁定普通帐号ftp根目录
默认:普通帐号登录之后,可以访问任何该帐号可以访问的路径,例如:/etc/,/bin。。。。
local_enable=YES 《--默认就有,允许本地帐号登录
write_enable=YES 《--默认就有,允许普通帐号有写的权限
chroot_local_user=YES
# setsebool -P ftp_home_dir=1
例子7:只锁定部分用户的家目录,部分用户不锁定
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list 《--该文件里的帐号都不锁定目录
# vim /etc/vsftpd/chroot_list
bean一行一个名字
ftp> pwd
257 "/home/bean"
应用场景:
网站 ---> 网站根目录/wwwroot/
网站bbs.upl.com ---> 网站根目录/wwwroot/bbs.upl.com
ftp帐号:www ,该帐号只能访问/wwwroot/目录下的所有文件
ftp帐号:bbs ,该帐号只能访问/wwwroot/bbs.upl.com目录下的所该帐号可以管理以上两个网站有文件
ftp帐号:mgr , 该帐号可以管理以上两个网站,甚至访问其他任何可以访问的目录,该帐号就可以不锁定家目录
# useradd -d /wwwroot/ -s /sbin/nologin www
# useradd -d /wwwroot/ -s /sbin/nologin bbs
例子8:实现某些帐号允许登录,某些帐号不允许登录
方法一:
如果需要禁止登录帐号是普通帐号(不是匿名帐号),只需要把用户的默认shell修改成/bin/false
注意:不是/sbin/nologin,该shell不允帐号登录系统,但允许登录ftp
方法二:
userlist_deny=YES <--如果该参数YES,那么userlist_file指定的文件就是黑名单
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
# vim /etc/vsftpd/user_list
tom 增加一行
思考:
什么时候使用黑名单,什么时候使用白名单?
课后思考:
恢复系统ftp为系统认证方式。
把所有普通帐号的根目录都统一锁定在/ftp
避免不同帐号上传的文件被其他帐号删除。
文件上传之后,权限自动为600。
man vsftpd.conf
例子9:使用虚拟帐号登录ftp
虚拟的帐号,系统本身不要存在,只是在vsftp服务里生效。
anonymous_enable=YES
guest_enable=YES <---启用虚拟帐号登录
guest_username=vuser <---虚拟帐号被映射成该系统帐号进行一切操作。
user_sub_token=$USER
pam_service_name=vuser 《--名字随意,对应/etc/pam.d/vuser
#pam_service_name=vsftpd 《--把原有的系统验证模块注释
建立对应自定义pam模块文件
# vim /etc/pam.d/vuser
#%PAM-1.0
auth sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/vus
er crypt=hash
account sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/vuser crypt=hash
建立对应的虚拟帐号数据库文件
# yum install db4-utils -y
# vim /etc/vsftpd/vuser.txt
vuser1
123
vuser2
456
mary
789
# chmod 600 /etc/vsftpd/vuser.txt
# db_load -T -t hash /etc/vsftpd/vuser.db < /etc/vsftpd/vuser.txt
把映射的系统帐号vuser建立起来
# useradd -d '/ftp' -s /sbin/nologin vuser
# usermod -d '/ftp/$USER' vuser
# finger vuser
Login: vuser Name: (null)
Directory: /ftp/$USER Shell: /sbin/nologin
把对应的家目录建立起来
# mkdir /ftp/vuser1
# mkdir /ftp/vuser2
# mkdir /ftp/mary
# chown vuser:vuser /ftp/*
# service vsftps restart
验证:
发现默认所有虚拟帐号都可以上传下载文件,原因:他们被映射成vuser这个系统存在的普通帐号。
假如,需要实现每个虚拟帐号都有独立的权限。
vuser1 可以上传下载,默认就可以上传下载,所以不需要建立独立配置文件
vuser2 只能下载。建立一个独立配置文件,取消上传功能。
# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/user_config
# mkdir /etc/vsftpd/user_config
# vim /etc/vsftpd/user_config/vuser2
write_enable=NO 《--该选项如何和vsftpd.conf冲突,那么vuser2登录时候采用本文件的参数,而其他选项将会使用vsftpd.conf
下周:
dns
http,nfs
samba
dhcp
sendmail
xinetd/tcpwrapper
shell 5
mysql 5
ule实践 10
阅读(697) | 评论(0) | 转发(0) |