Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46602
  • 博文数量: 18
  • 博客积分: 474
  • 博客等级: 下士
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-20 10:08
文章分类

全部博文(18)

文章存档

2011年(18)

分类: LINUX

2011-06-20 16:22:52

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


阅读(704) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~