FTP不同等级的用户身份:User、Guest、Anonymous
FTP可以利用系统的Syslogd来进行数据的记录;
FTP服务器使用了两个连接:命令通道与数据通道
FTP默认为主动连接
主动连接会被NAT阻断
Can't build data connection:Connection refused.
解决方法:FTP检测模块(ip_conntrack_ftp、ip_nat_ftp),但是,如果你链接的目标FTP服务器的命令通道默认端口号并非标准的21端口号时,这两个模块也就无法顺利解析出来。
被动式FTP数据通道的连接方向是客户端向服务器端连接。
vsftpd服务启动者身份为一般用户,所以对于Linux系统的权限较低。
所有来自客户端且想要使用这个上层程序所提供的较高执行权限的vsftpd命令的需求,均被视为不可信任的要求来处理,必须要经过相当程度的身份确认后,方可利用该上层程序的功能。
相关文件:
/etc/vsftpd/vsftpd.conf
/etc/pam.d/vsftpd
#用于身份认证
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
#userlist_enable、userlist_deny是否启用,如果说/etc/vsftpd/ftpusers是PAM模块的阻挡访问设置项目,那个/etc/vsftpd/user_list则是vsftpd自定义的阻挡访问项目。
/etc/vsftpd/chroot_list
#chroot_list_enalbe、chroot_list_file两个参数有关。如果想要将某些实体用户限制在它们的用户主目录下而不许到其它目录去,可以启动这个设置项目。
/usr/sbin/vsftpd
/var/ftp/
#file=限制用户无法使用vsftpd文件
[root@www ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny
file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
[root@www ~]# man 5 vsftpd.conf
1.服务器环境比较相关的设置值
connect_from_port_20=yes(no)
主动式连接使用的FTP服务器的Port
listen_port=21
这个设置仅适合以Stnad Alone的方式来启动,对于Super Daemon无效
dirmessage_enable=yes(no)
message_file=.message
登录显示信息
listen=yes(no)
YES使用Stand Alone的方式来启动,NO为Super Daemon
pasv_enable=yes(no)
支持Passive Mode
use_localtime=yes(no)
NO为GMT时间
write_enable
允许上传
accept_timeout=60
被动连接超时
connect_timeout=60
主动连接超时
data_connection_timeout=300
连接超时
idle_session_timeout=300
max_clients=0
#最大同时在线人数
max_per_ip=0
#IP无限制,同一IP连接数
pasv_max_port=0
#随机取端口
pasv_min_port=0
ftpd_banner=
登录说明文字
banner_file=/path/file
与实体用户相关的设置值
guest_enable=yes(no)
若这个值设置为Yes时,那么任何实体账号,均会被假设成为Guest
guest_username=ftp
指定访客身份
local_enable=yes(no)
以实体用户登录Ftp,默认为NO
local_max_rate=0
限速,0来不限
chroot_local_user=yes(no)
默认NO,yes为使用chroot
chroot_list_enable
是否启用chroot写入列表的功能;
chroot_list_file=/etvsftpd.confc/vsftpd.chroot_list
userlist_enable=yes(no)
是否借助Vsftpd的阻挡机制来处理某些不受欢迎的账号
userlist_deny=yes(no)
userlist_file=/etc/vsftpd/user_list
匿名用户登录的设置值:
anonymous_enable=yes(no)
anon_world_readable_only=yes(no)
仅允许anonymous具有下载可读文件的权限,默认是YES
anon_other_write_enable=yes(no)
anonymous可修改右删除,默认为NO,如果设置为YES,那么开放给anonymous写入的目录也要调整权限,让Vsftpd的PID拥有者可以写入才行
anon_mkdir_write_enable=yes(no)
默认NO,
anon_upload_enable=yes(no)
默认NO,上传
deny_email_enable=yes(no)
banned_email_file=/etc/vsftpd/banned_emails
no_anon_password=yes(no)
不要密码要Email
anon_max_rate=0
anon_umask=077
限制anonymous上传文件的权限
4.关于系统安全方面的一些设置值
ascii_download_enable=yes(no)
默认NO,优先使用ASCII格式来下载文件
ascii_upload_enable=yes(no)
默认NO,
one_process_model=yes(no)
当设置为Yes时,表示每个建立的连接都会拥有一个Process在负责,可以提高Vsftpd的效率。
tcp_wrappers=yes(no)
默认为NO
xferlog_enable=yes(no)
默认为NO,是否开启日志记录
xferlog_file=/var/log/xferlog
xferlog_std_format=yes(no)
wu-ftpd软件读取日志方式,默认为NO
dual_log_enable=yes(no)
vsftpd_log_file=/var/log/vsftpd.log
另外的日志
格式;
nopriv_user=nobody
pam_service_name=ftp
Pam模块名称
[root@www ~]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@www ~]# netstat -tulnp | grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3144/vsftpd
设置以Super daemon来启动vsftp:
[root@www ~]# cat /etc/xinetd.d/vsftpd
service ftp
{
socket_type=stream
wait=no
user=root
server=/usr/sbin/vsftpd
log_on_success+=DURATION USERID
log_on_failure+=USERID
nice=10
disable=no
}
[root@www ~]# /etc/init.d/vsftpd stop
Shutting down vsftpd: [FAILED]
[root@www ~]# /etc/init.d/xinetd stop
Stopping xinetd: [ OK ]
[root@www ~]# /etc/init.d/xinetd start
Starting xinetd: [ OK ]
用Restart好像不行
[root@www ~]# netstat -tulnp | grep xinetd
tcp 0 0 :::21 :::* LISTEN 3678/xinetd
tcp 0 0 :::23 :::* LISTEN 3678/xinetd
Centos默认Vsftp:
[root@www ~]# grep -v [#] /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
#支持匿名登录
local_enable=YES
#支持本地登录
write_enable=YES
#允许用户上传
local_umask=022
#目录755文件644
dirmessage_enable=YES
#目录下有.message就显示该文件内容
xferlog_enable=YES
#启用日志
connect_from_port_20=YES
#支持主动连接
xferlog_std_format=YES
#支持wuftp的日志格式
listen=YES
#Stand Alone
pam_service_name=vsftpd
#支持Pam管理
userlist_enable=YES
#支持/etc/vsftpd/user_list文件内的账号登录控制
tcp_wrappers=YES
#支持TCP Wrapper的防火墙机制
实体用户连接出错:500 OOPS:cannot change directory:/root
解决办法:SELINUX
[root@www ~]# setsebool ftp_home_dir=1
[root@www ~]# vim /etc/vsftpd/vsftpd.conf
use_localtime=yes
#让时间显示正常
[root@www ~]# /etc/init.d/vsftpd restart
登录信息设置和用户登录管理:
[root@www ~]# grep -v [#] /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
userlist_enable=YES
#用户登录限制功能
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
use_localtime=yes
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
tcp_wrappers=YES
banner_file=/etc/vsftpd/welcome.txt
[root@www ~]# cat /etc/vsftpd/welcome.txt
welcome to my ftp
/etc/vsftpd/ftpusers /etc/pamd.d/vsfptd设置管理
/etc/vsftpd/user_list
测试:
[root@www ~]# /etc/init.d/vsftpd restart
[root@www ~]# ftp localhost
Connected to localhost (127.0.0.1).
220-welcome to my ftp
#banner信息
220
Name (localhost:root): szm
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bye
221 Goodbye.
Chroot设置:
[root@www ~]# cat /etc/vsftpd/chroot_list
szm
#szm这个用户不被Chroot,其它的用户都会被Chroot
[root@www ~]# vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
#限制实体用户总下载带宽
local_max_rate=1000000
#bytes/second即1MBytes
建立严格的可用的FTP账号列表:
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
系统账号无法使用FTP是因为PAM模块与Vsftpd的内建功能所致,在下面的文件中都去掉限制即可
[root@www ~]# vim /etc/vsftpd/ftpusers
[root@www ~]# vim /etc/vsftpd/user_list
仅有匿名登录的相关设置:
1.ftp账号也就是匿名用户主目录
[root@www ~]# yum install finger
[root@www ~]# finger ftp
Login: ftp Name: FTP User
Directory:
/var/ftp Shell: /sbin/nologin
Never logged in.
No mail.
No Plan.
[root@www ~]# grep -v [#] /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
no_anon_password=YES
anon_max_rate=1000000
data_connection_timeout=60
idle_session_timeout=600
max_clients=50
max_per_ip=5
local_enable=NO
use_localtime=yes
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
tcp_wrappers=YES
banner_file=/etc/vsftpd/welcome.txt
[root@www ~]# /etc/init.d/vsftpd restart
测试:
[root@www ~]# ftp localhost
Connected to localhost (127.0.0.1).
220-welcome to my ftp
220
Name (localhost:root): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (127,0,0,1,124,131).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 24 Apr 14 14:30 index.html
drwxr-xr-x 2 0 0 4096 Nov 12 2010 pub
226 Directory send OK.
ftp> bye
221 Goodbye.
匿名用户权限放到最大:
write_enable=yes
anon_other_write_enable=yes
#删除、更名等权限
anon_mkdir_write_enable=yes
anon_upload_enable=yes
#上传
因为匿名用户的权限就是Ftp的用户权限,要想上传成功,还要做下面的设置
[root@www ~]# mkdir /var/ftp/uploads
[root@www ~]# chown ftp /var/ftp/uploads
[root@www ~]# setsebool -P allow_ftpd_anon_write=1
[root@www ~]# setsebool -P allow_ftpd_full_access=1
上面这样设置后只能上传,不能下载,加上下面的设置即可,默认为077
anon_umask=073
#因为anonymous默认是在others那里的
让匿名用户仅具有上传权限,不可下载匿名用户上传的东西:????鸟哥有错?
chown_uploads=YES
chown_username=daemon
被动连接端口的限制:
pasv_max_port=65400
pasv_min_port=65410
防火墙设置:
1.加入两个模块
[root@www ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp" #修改
[root@www ~]# /etc/init.d/iptables restart
iptables: Applying firewall rules: [ OK ]
iptables: Loading additional modules: ip_nat_ftp ip_conntra[ OK ]
2.开放21端口
[root@www ~]# iptables -A INPUT -p TCP --dport 21 -j ACCEPT
3.开放Port65400~65410给Internet使用
[root@www ~]# iptables -A INPUT -p TCP --dport 65400:65410 -j ACCEPT
开启两个日志记录:
dual_log_enable=yes(no)
vsftpd_log_file=/var/log/vsftpd.log
访问方式:
让vsftpd增加SSL的加密功能
方法一:
[root@www ~]# ldd $(which vsftpd) | grep ssl
#查看是否有SSL模块
libssl.so.10 => /usr/lib/libssl.so.10 (0x00411000)
生成证书:
[root@www ~]# cd /etc/pki/tls/certs/
[root@www certs]# make vsftpd.pem
[root@www certs]# ll /etc/vsftpd/vsftpd.pem
#注意看证书文件的权限
-rw-------. 1 root root 3031 Apr 15 22:00 /etc/vsftpd/vsftpd.pem
[root@www certs]# vim /etc/vsftpd/vsftpd.conf
ssl_enable=yes
#启动SSL
allow_anon_ssl=NO
#匿名用户不启用SSL
force_local_data_ssl=YES
#实体用户强制使用SSL
force_local_logins_ssl=YES
#登录也强制SSL
ssl_tlsv1=YES
#支持TLS方式即可,下面不用启动
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem
[root@www certs]# /etc/init.d/vsftpd restart
方法二:
[root@www certs]# make vsftpd.key
umask 77 ; \
/usr/bin/openssl genrsa -aes128 2048 > vsftpd.key
Generating RSA private key, 2048 bit long modulus
...................+++
...........................+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
[root@www certs]# mv vsftpd.key vsftpd.raw
[root@www certs]# openssl rsa -in vsftpd.raw -out vsftpd.key
Enter pass phrase for vsftpd.raw:
writing RSA key
[root@www certs]# rm -f vsftpd.raw
[root@www certs]# chmod 400 vsftpd.key
[root@www certs]# make vsftpd.crt SERIAL=2013041501
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key vsftpd.key -x509 -days 365 -out vsftpd.crt -set_serial 2013041501
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:GZ
Locality Name (eg, city) [Default City]:GZ
Organization Name (eg, company) [Default Company Ltd]:szmO
Organizational Unit Name (eg, section) []:szm
Common Name (eg, your name or your server's hostname) []:szmname
[root@www certs]# ll vsftpd.*
-rw-------. 1 root root 1338 Apr 15 22:55 vsftpd.crt
-r--------. 1 root root 1679 Apr 15 22:53 vsftpd.key
[root@www certs]# mkdir /etc/vsftpd/certs
[root@www certs]# cp vsftpd.* /etc/vsftpd/certs/
[root@www certs]# cd /etc/pki/tls/certs/
[root@www certs]# vi /etc/vsftpd/vsftpd.conf
ssl_enable=yes
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
rsa_cert_file=/etc/vsftpd/certs/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/certs/vsftpd.key