su:Switch User,即切换用户
su [-l user] -c ‘COMMAND’
如:su -l root -c ‘COMMAND’
如果没有指定-l user,则默认是root
sudo:可以让某个用户不需要拥有管理员的密码,而可以执行管理员的权限。
需要授权,授权之后,能够让某用户以另外一个用户的身份运行命令。
授权依赖配置文件:sudoers
sudo的用法 : # sudo COMMAND
配置文件sudoers:/etc/sudoers
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
以上每一列的含义如下:
第一列:用户名(带%的是组名),如root、test;运行命令者的身份(who,即user)。
第二列:等号左边的ALL表示允许从任何主机登录当前的用户账户,即通过哪些主机(where,即host);等号右边的ALL表示第一列的用户可以切换成系统中任何一个其它用户,即以哪个用户的身份(whom,即runas)(如:su test)。
第三列:第一列的用户能下达的命令,ALL表示可以下达任何命令。也可以指定特定命令,即运行哪些命令(which,即command),如/sbin/useradd,/sbin/userdel
配置项:
users hosts=(runas) commands
users:可以是username,或#uid或user_alias或%group_name或%#gid
hosts:ip、hostname、netaddr
commands:command name、directory、sudoedit
Alias_Type NAME = item1, item2, ...
NAME:必须是全部大写
Alias_Type:User_Alias、Host_Alias、Runas_Alias、Cmnd_Alias
测试:修改sudo配置文件,添加用户及可以执行命令
添加用户:
可执行的命令:
测试执行:
设置的命令出错了,是/sbin/ip,而不是/usr/sbin/ip,修改后:
sudo有个检票机制,即在输入用户密码后的5分钟内,执行命令不需要再次输入密码,使用sudo -k可以取消这次检票功能,即需要再次输入密码。
sudo的选项:
-V:显示版本号
-h:显示版本编号及指令的使用方式说明,即帮助
-l:显示出自己(执行sudo的使用者)的权限
-k:强迫使用者在下一次执行sudo时问密码
-b:将要执行的指令放在后台执行
-u user:以user用户身份运行
文件共享服务:应用层 ftp
NFS:Network File System(基于RPC:Remote Procedure Call,远程过程调用)
Samba:在Linux实现CIFS(SMB)协议,跨平台
DAS,NAS,SAN
mogileFS
mooseFS
hadoop HDFS
FTP,文件传输协议:采用C/S模型,即客户端和服务器,基于tcp,采用双TCP连接方式,两个连接:
命令连接/控制连接:21/tcp,用于传输命令及命令执行信息,整个FTP会话期间一直保持打开
数据连接:用于数据的上传下载文件列表发送等,数据传输结束后数据连接将终止。分两种情况
主动模式:20/tcp,服务器端使用tcp的20端口主动连接客户端,用于数据连接,客户端的端口是客户端控制连接端口号加1,如果占用,再加1,以此类推。
被动模式:主动模式中客户端一般有防火墙,容易连接失败,服务器通过控制连接,告诉客户端一个服务器随机端口号,由客户端连接这个端口。这就是被动模式。
数据传输模式:二进制模式和文本(ASCII模式)两种,(服务器客户端采用自动模式协商决定)
● 文本传输器使用ASCII字符,并由回车键和换行符分开,而二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,并且可以传输所有ASCII值,所以系统管理员一般将FTP设置成二进制模式。
● 二进制模式用来传送可执行文件,压缩文件,和图片文件。如果用ASCII模式传,会显示一堆乱码,必须重新用BINARY模式传。用HTML和文本编写的文件必须用ASCII模式上传,用BINARY模式上传会破坏文件,导致文件执行出错。
ftp server --> ftp client
主动方式也称为PORT方式,是FTP协议最初定义的数据传输连接方式,主要特点是:
● FTP客户端通过向FTP服务器发送PORT命令,告诉服务器该客户端用于传输数据的临时端口号
● 当需要传送数据时,服务器通过TCP端口号20与客户端的临时端口建立数据传输通道,完成数据传输。
在建立数据连接的过程中,由服务器主动发起连接,因此被称为主动方式。
被动方式也称为PASV方式,被动方式的主要特点是:
● FTP客户端通过向FTP服务器发送PASV命令,告诉服务器进入被动方式。服务器选择临时端口号并告知客户端
● 当需要传送数据时,客户端主动与服务器的临时端口号建立数据传输通道,完成数据传输
在整个过程中,由于服务器总是被动接收客户端的数据连接,因此被称为被动方式。
数据的类型:
结构化数据
半结构化数据
非结构化数据
服务器端程序:
vsftpd:very Secure ftp Daemon
proftpd:
客户端层序:
CLI:ftp、lftp
GUI:gftp、FlashFXP、Cuteftp
FTP的典型消息:
消息号及含义:
125:数据连接打开,传输开始; 200:命令OK ; 226:数据传输完毕; 331:用户名OK;
425:不能打开数据连接; 426:数据连接被关闭,传输被中断; 452:错误写文件;
500:语法错误,不可识别的命令;
vsftpd:
支持基于IP的虚拟FTP服务器;支持虚拟用户;支持PAM或xinetd/tcp_wrappers的认证方式;支持两种运行方式:独立和Xinetd;支持每个虚拟用户具有独立的配置;支持带宽限制等。
安装:yum install vsftpd
查看安装文件:
启动:
用户认证:虚拟用户:仅用于访问某特定服务中的资源
nsswitch:network service switch,名称解析框架,配置文件:/etc/nsswitch.conf
模块:/lib64/libnss*,/usr/lib64/libnss*
pam:pluggable authentication module,模块:/lib64/security/,
配置文件:/etc/pam.conf,/etc/pam.d/*
/etc/vsftpd:配置文件目录
/etc/init.d/vsftpd:服务脚本
/usr/sbin/vsftpd:主程序
基于PAM实现用户认证:
/etc/pam.d/*
/lib/security/*
/lib64/security/*
支持虚拟用户
文件目录:
/var/ftp:只对root用户具有写权限
上传和下载: 下载一般风险较少,上传则风险较大。
FTP用户类型
匿名用户:anonymous或ftp
本地用户:账号名称、密码等信息保存在passwd、shadow文件中
虚拟用户:使用独立的账号/密码数据文件
ftp:系统用户
匿名用户(映射为ftp用户)--> 系统用户,anonymous_enable=YES|NO,共享资源位置:/var/ftp
虚拟用户 --> 系统用户,资源位置是给虚拟用户指定的映射成为的系统用户的家目录
系统用户:local_enable=YES|NO,访问的是系统用户的家目录。
/var/ftp:ftp用户的家目录
匿名用户访问目录
通过上面的命令,可以看到匿名用户是映射到ftp用户
chroot:禁锢用户于其家目录中
系统用户:write_enable=YES:上传文件
文件服务权限:文件系统权限*文件共享权限
测试操作:
启动vsftpd服务后,直接ftp登录:
可以看到,即使是匿名用户登录,也需要输入用户名。
匿名用户显示当前目录为"/",即根目录,当实际文件系统目录是/var/ftp
配置vsftpd:文件/etc/vsftpd/vsftpd.conf
anonymous_enable=NO,禁止匿名访问
添加系统用户,使用系统用户登录:
useradd test01
配置中增加:local_enable=YES
使用系统用户登录:
可以看到,使用系统用户,登录的默认路径是系统用户的家目录,而且可以切换到其他系统路径,这是很危险的操作。一般正常应该锁定(禁锢)在FTP的根目录,即/var/ftp
chroot:禁锢用户于其家目录中。
系统用户,配置文件中:write_enable=YES:允许系统用户上传文件
使用匿名用户登录,再次测试上传文件:
发现无法上传。
在配置文件中有 #anon_upload_enable=YES,就是用来设置匿名用户是否可以上传文件,默认是不允许。
将此项设置打开,即anon_upload_enable=YES,重新加载配置后,再次测试上传。
发现依然没有上传成功,但是提示信息变化了,由原来的550 Permission denied变为553 Could not create file。即原来是权限拒绝变成了无法创建文件。
/var/ftp以及/var/ftp/pub两个目录的属主属组都是root,且只有属主root才具有写权限,即w权限。
而启动ftp进程处理数据传输的用户是ftp,所以需要目录对ftp用户具有写权限。
创建一个子目录,使其对ftp用户具有写权限:
所以,文件服务权限取决于:文件系统权限 * 文件共享权限
测试在此目录下创建子目录和删除文件:
不能创建子目录,不能删除文件。这两项属于不同的权限设置,在配置文件中,有如下设置项:
anon_mkdir_write_enable=YES和anon_other_write_enable=YES,即是来开启匿名用户创建子目录和删除文件的权限。
先测第一项,创建目录:
能创建,不能删除,开放第二项other配置:
dirmessage_enable=YES,启动目录的欢迎信息,在目录下创建.message文件,文件中写上相关信息,在进入此目录时显示此文件中的信息。
banner_file=/var/vsftpd-banner,登录FTP站点时,显示的欢迎信息,欢迎信息定义在一个文件中,这里假设定义在/var/vsftpd-banner
ftpd_banner=My FTP Server 12,不是很复杂的提示信息或欢迎信息,可以直接用ftpd_banner=xxx来实现。
xferlog_enable=YES,启用ftp的日志功能,但是光启动这一项还不行,还要启用xferlog_file=/var/log/xferlog,即指定日志文件的位置:
日志的格式,使用xferlog_std_format=YES,标准格式。
#chown_uploads=YES 和 #chown_username=whoever
上传后改变属主。改变以后,当前用户对文件的权限就会受到限制。
#idle_session_timeout=600,控制链接的空闲时间。
#data_connection_timeout=120,数据传输链接的超时时间。
#ascii_upload_enable=YES 和 #ascii_download_enable=YES,以ascii进行上传下载
#chroot_list_enable=YES 和 #chroot_list_file=/etc/vsftpd/chroot_list,第一项是启用禁锢用户功能,第二项指定一个文件,在文件中列出需要禁锢的用户列表。在chroot_list中添加test01:
此时,test01用户被禁锢在FTP的根目录下。
#chroot_local_user=YES,如果想禁锢所有的系统用户,可以使用这条配置,上面两条就不需要了。
使用root用户进行登录测试:
不允许登录。在/etc/vsftpd目录下有ftpusers文件,其中每一行是一个系统用户名,这些用户不允许登录vsftpd。
默认vsftpd使用的是pam认证,在vsftpd.conf配置文件中。有pam_service_name=vsftpdp配置项。
PAM使用vsftpd文件,如下:
可以看到,PAM认证使用ftpusers文件,默认是deny。
vsftpd还可以使用user_list文件进行登录用户的控制。配置文件中有userlist_enable=YES,说明启用user_list文件进行用户控制,默认文件中的用户不允许登录,即有一个默认配置项:userlist_deny=YES
将test03加入这个文件中,测试:
可以发现无法登陆;如果修改默认权限配置,即增加userlist_deny=NO,即允许登录,再次测试:
可以看到,test03登录成功,root还是登录失败,但是可以输入密码了,因为还要受到ftpusers文件设定权限的限制。将ftpusers中的root去掉,再次测试:
root登录成功。
max_clients=# 最大并发连接数
max_per_ip=# 每个客户端IP地址可同时发起的最多并发请求数数
local_max_rate=# 系统用户(本地用户)的最大传输速率设置
anon_max_rate=# 匿名用户的最大传输速率设置
pasv_min_port=# pasv_max_port=# 将使客户端连接时的端口范围在最小值和最大值之间。
chown_uploads=YES
chown_username=nobody 启用上传文件修改属主,属主改为nobody。
虚拟用户:所有的虚拟用户会被统计映射为一个指定的系统账号,访问的共享位置即为此系统用户的家目录;各虚拟用户可被赋予不同的访问权限,主要是通过匿名用户的权限控制参数进行指定。
构建基于虚拟用户的vsftpd服务器——虚拟用户账号基于文件:
1、建立虚拟FTP用户的账号数据库文件;
2、创建FTP根目录及虚拟用户映射的系统用户;
3、建立支持虚拟用户的PAM认证文件;
4、在vsftpd.conf文件中添加支持配置;
5、为个别虚拟用户建立独立的配置文件;
6、重新加载vsftpd配置;
7、使用虚拟FTP账号访问测试;
1、创建虚拟FTP用户账户文件,在/etc/vsftpd/目录下创建vusers.list,格式为每两行代表一个用户,奇数行代表用户名,偶数行代表密码。如:
user01
pass01
user02
pass02
将上述文件转化为Berkeley DB格式的数据文件,使用db_load 转换工具,需安装 db4-utils-4.3.29-9.fc6.i386.rpm 软件包。
在使用 db_load 命令时,“-f”选项用于指定用户名/密码列表文件,“-T”选项允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件,“-t hash”选项指定读取数据文件的基本方法。将帐号文件的权限设置为600,可以有效提高安全性。
2、创建FTP根目录及虚拟用户映射的系统用户,vsftpd虚拟用户需要有一个对应的系统用户帐号(该帐号无需设置密码及登录Shell),该用户帐号的宿主目录作为所有虚拟用户登录后的共同FTP根目录。
3、建立支持虚拟用户的PAM认证文件:/etc/pam.d/vsftpd.vu
PAM配置文件(名称可以自行定义)主要用于为程序提供用户认证控制,vsftpd服务使用的默认PAM配置文件为/etc/pam.d/vsftpd,可以参考该文件的格式建立新的PAM配置文件,用于虚拟用户认证控制 。如下文件,其中db=就是上一步vusers.list转换的vusers.db,不需要加后缀。
4、在vsftpd.conf文件中添加支持配置:
pam_service_name=vsftpd.vu,指定PAM验证使用的文件,即上一步创建的文件;
local_enable=YES,因为映射的是本地用户登录,所以这一项要配置成YES;
guest_enable=YES和guest_username=virtualuser,配置虚拟用户可以访问;
userlist_enable=YES和userlist_deny=NO先注释掉,将匿名用户的配置注释掉,即以anon开头的配置注释掉。
测试,使用虚拟用户可以登录,但是不能创建目录,不能上传文件:
在vsftpd.conf配置文件中添加guest_enable、guest_username配置项,将访问FTP服务的所有虚拟用户对应到同一系统用户帐号virtualuser。并修改pam_service_name配置项,指向上一步建立的PAM配置文件/etc/pam.d/vsftpd.vu
在vsftpd服务中,虚拟用户帐户默认作为匿名用户处理以降低权限,因此对应的权限设置通常使用以anon_开头的配置项。例如,在设置虚拟用户所上传文件的默认权限掩码时应采用配置项anon_umask而不是local_umask。
5、为个别虚拟用户建立独立的配置文件
在vsftpd.conf文件中添加用户配置目录支持
user_config_dir=/etc/vsftpd/vusers_dir ,这里目录为vusers_home
为用户user01、user02建立独立的配置目录及文件, 配置文件名与用户名同名
此时可以创建目录,可以上传文件。
一个很奇怪的问题是:在使用CentOS的ftp命令登录时,只能创建目录,不能上传文件,改为lftp就可以。
构建基于虚拟用户的vsftpd服务器——虚拟用户账号基于Mysql:
1、安装mysql数据库,系统上已经编译安装了MariaDB,此步骤略过;
2、安装相关包:yum install mysql-devel pam_mysql
3、准备数据库及相关表;首先请确保mysql服务已经正常启动。而后,按需要建立存储虚拟用户的数据库即可,这里将其创建为vsftpd数据库。
mysql> create database vsftpd;
mysql> grant select on vsftpd.* to vsftpd@localhost identified by '123456';
mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by '123456';
mysql> flush privileges;
mysql> use vsftpd;
mysql> create table users (
id int AUTO_INCREMENT NOT NULL,
name char(20) binary NOT NULL,
password char(48) binary NOT NULL,
primary key(id) );
添加测试的虚拟用户,根据需要添加所需要的用户,需要说明的是,这里将其密码为了安全起见应该使用PASSWORD函数加密后存储。
mysql> insert into users(name,password) values('vuser01',password('123456'));
mysql> insert into users(name,password) values('vuser02',password('123456'));
4、配置vsftpd
1)建立pam认证所需文件
#vi /etc/pam.d/vsftpd.mysql
添加如下两行
auth required /lib64/security/pam_mysql.so user=vsftpd passwd=123456 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib64/security/pam_mysql.so user=vsftpd passwd=123456 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
注意:由于mysql的安装方式不同,pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。
2)修改vsftpd的配置文件,使其适应mysql认证
建立虚拟用户映射的系统用户及对应的目录,利用上一次的虚拟用户:
# useradd -s /sbin/nologin -d /var/myftproot virtualuser
# chmod go+rx /var/myftproot
请确保/etc/vsftpd.conf中已经启用了以下选项
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES
而后添加以下选项
guest_enable=YES
guest_username=vuser
并确保pam_service_name选项的值如下所示
pam_service_name=vsftpd.mysql
5、重启vsftpd,访问测试:
6、配置虚拟用户具有不同的访问权限:与上一个使用文件的虚拟用户一样,vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。
配置vsftpd为虚拟用户使用配置文件目录:
# vim vsftpd.conf , 添加如下选项
user_config_dir=/etc/vsftpd/vusers_home
创建所需要目录,并为虚拟用户提供配置文件:
# mkdir /etc/vsftpd/vusers_home/
# cd /etc/vsftpd/vusers_home/
# touch vuser01
配置虚拟用户的访问权限:
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。修改/etc/vsftpd/vusers_config/vuser01文件,在里面添加如下选项即可。
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
lftp命令:支持命令行补全,语法着色等
lftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site] 登录ftp服务器
lftpget [-c] [-d] [-v] URL [URL...] 下载文件命令
axel,可以多线程下载,支持断点续传。
ftp协议是明文的,如要安全,使用:
ftps:SSL
sftp:SSH