一、vsftpd服务
FTP是File Transfer Protocol( 文件传输协议)的缩写,有两种工作方式,PORT方式(主动式)和PASV方式(被动式)。
FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP 客户端与服务器之间传递命令;另一个是 数据链路,用来上传或下载数据。
vsftpd服务提供了一种安全的文件传输方式。
服务端配置了vsftpd服务后,需关闭防火墙,并且配置selinux相关文件允许该服务传输文件。
客户端通过lftp软件,登录服务端的本地用户,上传或者下载vsftpd服务端的文件。
vsftpd服务允许匿名用户(ftp用户)、服务器本地用户、服务器本地虚拟用户登录。
具体配置可以通过以下命令查看
vim /etc/vsftpd/vsftpd.conf #vsftpd的配置文件
man 5 vsftpd.conf #man 5 查看文件的帮助
全局设置
anonymous_enable=YES #允许匿名用户登录
local_enable=YES #允许本地用户登录
geust_enable=YES #允许虚拟用户登录
max_clients=4 #允许用户最大连接数,默认为0,即不限制连接数
write_enable=YES ##允许写权限,STOR, DELE, RNFR,RNTO, MKD, RMD, APPE and SITE.
STOR - store a file on the remote host 上传文件
DELE - delete a remote file 删除文件
RNFR - rename from 重命名
RNTO - rename to 重命名
MKD - make a remote directory 新建文件夹
RMD - remove a remote directory 删除目录
APPE - append to a remote file 附加到文件
SITE - site-specific commands 服务器的特定命令
#还有很多设置可以通过man 5 vsftpd.conf查看
1、虚拟用户权限设置
当客户端不指定用户登陆时,并且设置允许匿名用户登录时,就会默认以本地的ftp用户作为匿名用户登录。
lftp 服务端ip #匿名用户登录
当服务器安装vsftpd服务以后,会自动在本地新建一个ftp用户。
cat /etc/passwd | grep ftp
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin ##该用户不可交互式登录shell
安装服务时,应该都会新建一个系统用户,例如httpd,dhcpd等
匿名用户登录时,默认访问以下目录中的文件,并且无法切换出该目录
/var/ftp/ #vsftpd的默认发布目录,即ftp用户的默认访问目录
anon_root=/direcotry #修改匿名用户的默认访问目录
匿名用户(ftp用户)下载时,必须对该文件或者目录有读权限,并且有以下设置限制
anon_world_readable_only=no#默认为yes,全世界有读权限时(即ugo+r)才允许匿名用户下载,为no时只需要ftp用户有读权限即可
匿名用户(ftp用户)上传文件时,ftp用户必须对所在的目录有写权限,以及一下设置
write_enable=YES #全局写权限开启
anon_upload_enable=YES #匿名用户上传权限开启
anon_umask=022 #匿名用户上传文件的权限掩码,默认为077
匿名用户创建目录及其他权限
anon_mkdir_write_enable=YES # 设置匿名用户可以创建目录
anon_other_write_enable=YES #匿名用户的其他权限,例如删除和重命名
设置匿名用户上传的文件为student所有
chown_uploads=YES #开启改变上传文件所有人的功能,默认为root
chown_username=student #设置匿名用户上传文件所有人
chown_uploads_mode=0644 ##设置上传文件的权限
anon_max_rate=102400 #匿名用户最大传输速率为100kb,数据单位是bytes per second,字节每秒
2、本地用户设置
当以指定用户登录时,需要输入该用户密码
lftp 服务端ip 服务端用户名
本地用户默认访问自己的家目录,可以修改默认访问目录
local_root=/directory
本地用户上传文件,本地用户需对上传所在目录有写权限。
write_enable=YES #开启全局写权限
local_umask=022 #设置上传文件的权限掩码
local_max_rate #本地用户最大传输速率,单位bytes per second
限制用户在自己的家目录,
chroot_local_user=YES #YES时,用户只能访问自己的家目录,但是实际访问时会出现错误。
[root@localhost Desktop]# lftp 172.25.254.15 -u student
Password:
lftp student@172.25.254.15:~> ls
cd: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
以上设置的意思应该是,把用户家目录作为访问的根目录,但是作为根目录,普通用户有写权限是极不安全的,
所以需要将用户家目录的写权限限制
chmod u-w /home/*
dr-x------. 14 student student 4096 Nov 1 14:40 student
[root@localhost Desktop]# lftp 172.25.254.15 -u student
Password:
lftp student@172.25.254.15:/> ls
drwxr-xr-x 2 1000 1000 6 Oct 24 07:39 下载
drwxr-xr-x 2 1000 1000 6 Oct 24 07:39 公共
drwxr-xr-x 2 1000 1000 6 Oct 24 07:39 图片
drwxr-xr-x 2 1000 1000 6 Oct 24 07:39 文档
drwxr-xr-x 2 1000 1000 6 Oct 24 07:39 桌面
drwxr-xr-x 2 1000 1000 6 Oct 24 07:39 模板
drwxr-xr-x 2 1000 1000 6 Oct 24 07:39 视频
drwxr-xr-x 2 1000 1000 6 Oct 24 07:39 音乐
设置限制用户切出家目录的黑白名单
chroot_local_user=YES #设置为YES时,将所有用户限制在自己家目录。默认情况是NO,即默认不限制
chroot_list_enable=YES #启动例外用户的名单。
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list #例外用户名单,这个文件保存的是第一条设置的黑名单。
#当chroot_local_user=YES时,此名单不限制用户在家目录,=NO时,此名单限制用户在家目录。
设置本地用户登录的黑白名单
vim /etc/vsftpd/ftpusers #用户黑名单
还有一个文件,可以设置为黑名单或者白名单
userlist_deny=NO #为NO时,表示下面的文件为白名单,为YES时,是黑名单,默认是YES
/etc/vsftpd/user_list YES #当被设置成白名单时,只有该文件中的用户可以登录
3、虚拟用户设置
创建虚拟用户
vim /etc/vsftpd/loginusers #创建文件保存用户名和密码,名字随意
ftpuser1 #奇数行用户名,偶数行密码,不要多出空行
123
ftpuser2
123
ftpuser3
123
将以上文件加入数据库
db_load -T -t hash -f /etc/vsftpd/loginusers /etc/vsftpd_loginusers.db
#-T表示允许应用程序能够将文本文件转译载入进数据库,
#-T 的子选项-t,追加在在-T选项后,用来指定转译载入的数据库类型,这里设置的是bd数据库类型。hash表示使用hash加密,
#-f 指定包含用户名和密码的文本文件,db_load命令可以将用户文本信息文件转换为db数据库并使用hash加密
在验证登录的配置文件中加入保存用户名和密码的文件
vim /etc/pam.d/ckvsftpd #自己创建文件,名称任意
account required pam_userdb.so db=/etc/vsftpd/loginusers
auth required pam_userdb.so db=/etc/vsftpd/loginusers
最后在vsftpd配置文件中设置,允许虚拟用户登录并且指定验证登陆的文件
vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
pam_service_name=ckvsftpd
指定虚拟用户以一个本地用户的身份登录,默认访问该用户的家目录
useradd -s /sbin/nologin -M ftpuser #添加一个用户,该用户不可登录系统,并且不创建用户家目录
guest_username=ftpuser
设置虚拟用户访问时的默认目录
mkdir /ftpuserhome #新建一个目录作为虚拟用户的家目录
chgrp ftpuser /ftpuserhome #设置这个目录的所属组为ftpuser用户所属组
chmod g+s /ftpuserhome #添加强制位,该目录下新建的目录及文件所属组为该目录所属组
mkdir /ftpuserhome/ftpuser{1..3} #分别创建桑和虚拟用户的家目录
设定虚拟用户家目录
vim /etc/vsftpd/vsftpd.conf #编辑vsftpd配置文件
local_root=/ftpuserhome/$USER
user_sub_token=$USER
单独设置虚拟账号配置文件
mkdir -p /etc/vsftpd/userconf
#在vsftpd配置文件中制定该文件生效
user_config_dir=/etc/vsftpd/userconf
vim /etc/vsftpd/userconf/ftpuser1 #在这个文件中设置的相关参数优先级高
设置了配置文件的参数之后,记得重启服务。
2、SELinux
SELinux是 Security-Enhanced Linux 的简称,是Linux的一个扩张“强制访问控制”的安全模块。
设置selinux模式,需要重启才能生效
vim /etc/sysconfig/selinux
2 # This file controls the state of SELinux on the system.
3 # SELINUX= can take one of these three values:
4 # enforcing - SELinux security policy is enforced. ##实行安全管理
5 # permissive - SELinux prints warnings instead of enforcing. ##显示警告代替实行
6 # disabled - No SELinux policy is loaded. ##不实行
7 SELINUX=disable
getenforce #查看selinux状态
临时设置selinux模式,不需要重启
setenforce 0 #设置SELinux为permissive模式
setenforce 1 #设置SELinux为enforcing模式
selinux对linux文件安全有十分严格的控制
例如,我们在桌面新建一个文件,将这个文件mv到httpd的默认发布目录,
但是selinux设置为1时候通过http却不能访问这个文件。
同一磁盘下的文件,mv相当于重命名,不同磁盘下mv是剪切,粘贴的过程。
不能通过http访问是因为每个文件创建时都有一个标签,叫做文件的安全上下文,mv不能改变这个文件的安全上下文。
ls -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 liu1
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 westos
这个标签可以通过命令改变标签,
[root@localhost html]# chcon unconfined_u:object_r:httpd_sys_content_t:s0 liu1
[root@localhost html]# ls -Z
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 liu1
也可以通过restorecon 命令恢复文件的安全上下文
[root@localhost html]# restorecon liu1
selinux对各个服务也有相应的设置,例如一下与文件传输服务相关的布尔选项
[root@localhost Desktop]# getsebool -a | grep ftp #查看selinux对ftp的相关设置
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
可以通过开启ftp相关布尔选项,让ftp在selinux开启的情况下也能正常使用
setsebool -P ftpd_anon_write on #开启匿名用户的写权限
setsebool -P ftp_home_dir on #用户可以访问家目录
setsebool -P ftpd_full_access on #所有的访问都通过,使用虚拟用户时需开启