Linux的安全性高是人人皆知的,可以分别设置user,group,other的r/w/x的权限。
但是,对于我这种注重数据安全的人来说,这样简单的权限设置已无法满足我的需求。
就以Nginx+PHP-FPM的环境为例。一般给Nginx和php-fpm fork出来的进程的用户身份不同的。
假如给Nginx的执行身份是用户nginx,而php-fpm的执行身份是php-fpm。
在网站所有文件owner都是php-fpm的情况下,给网站目录的文件的最低权限就是505(user:r_x,group:___,other:r_x)(不能再低了,再低就无法正常访问了)。本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
WHY?其中user的r权限是给PHP-FPM读取php文件的,x是给php-fpm进入该目录。other的r是给nginx读取静态资源的,x权限是允许nginx进入该网站目录。(根目录可501)。本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
假如有一个用户获得了服务器的shell权限,他的身份不是nginx,也不是php-fpm,由于该网站根目录给了other的x权限,以及网站文件有r权限,那么他就可以轻易地把网站的东西cat出来,例如wp-config.php……本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
前面已经说了,Linux的安全性很高,那么对权限的设置,肯定还有更高级的东西——ACL。本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
ACL是Access Control List的缩写,中文全名是“访问控制列表”。该东西的强大之处就在于:可以单独的赋予某个用户对某个文件/目录的权限。本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
其实Windows也有ACL,NTFS才支持:本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
Linux要启用ACL,首先就要为挂载的分区增加ACL参数(OpenVZ貌似不支持)本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
取得设备文件名:
1 |
df 目录 |
1 |
mount 设备文件名/挂载点 -o remount,acl |
成功执行后,执行mount,看到那个挂载的分区有了acl这三个字母就代表成功了。建议把ACL参数增加到/etc/fstab里面,不然重启后就没了。本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
然后安装ACL,
Debian/Ubuntu的执行:
1 |
apt-get install -y acl |
CentOS的执行:
1 |
yum install -y acl |
安装后,系统就会多两个可以使用的命令:setfacl,getfacl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
setfacl 2.2.49 -- set file access control lists Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ... -m, --modify=acl modify the current ACL(s) of file(s) -M, --modify-file=file read ACL entries to modify from file -x, --remove=acl remove entries from the ACL(s) of file(s) -X, --remove-file=file read ACL entries to remove from file -b, --remove-all remove all extended ACL entries -k, --remove-default remove the default ACL --set=acl set the ACL of file(s), replacing the current ACL --set-file=file read ACL entries to set from file --mask do recalculate the effective rights mask -n, --no-mask don't recalculate the effective rights mask -d, --default operations apply to the default ACL -R, --recursive recurse into subdirectories -L, --logical logical walk, follow symbolic links -P, --physical physical walk, do not follow symbolic links --restore=file restore ACLs (inverse of `getfacl -R') --test test mode (ACLs are not modified) -v, --version print version and exit -h, --help this help text |
setfacl是设置ACL权限的,getacl是获取ACL权限。
例如:
1 2 3 4 5 |
递归设置默认权限: setfacl -Rm d:u:用户名:权限 文件名 递归设置权限: setfacl -Rm u:用户名:权限 文件名 |
1 |
getfacl 文件名 |
以/var/www这个目录为例:
首先给该目录赋予正确的所有者以及群组,并且根据是否需要给予写入权限,来赋予700或者500权限:本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
1 |
chown -R 用户名:群组名 目录名 |
需要给所有者写入权限就执行:
1 |
chmod -R 700 目录名 |
不需要写入权限则执行:
1 |
chmod -R 500 目录名 |
接下来要使用setfacl,赋予Nginx的执行用户nginx访问该目录以及文件的权限:
要使用的参数有-R(递归设置),-m(修改权限),-d(默认权限)
1 2 |
setfacl -Rm d:u:nginx:rx /var/www setfacl -Rm u:nginx:rx /var/www |
使用ls -l可以看到文件的权限最后都有一个+:
此时可以使用getfacl查看这些文件的真实权限:
可以看到user(所有者)的权限没变,而用户nginx的权限变成了rx,群组,其他人则无任何权限。本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
请注意此时不要用chmod更改群组和other的权限,否则可能会导致ACL权限失效。本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
用other的身份再去访问和读取一下这些目录和文件:
均提示权限不足。
然后切换为nginx再看看:
读取毫无阻碍。
这样的话,极大地增强了网站目录的安全性,减少被跨站的机会。。本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
如果要删除ACL权限呢?把-m参数改成-b参数就行:
1 2 |
setfacl -Rb d:u:nginx:rx /var/www setfacl -Rb u:nginx:rx /var/www |
执行后使用ls -l查看,+没了就代表成功删除。
至于setfacl和getfacl更详细的介绍,大家可以看man page:
1 2 |
man setfacl man getfacl |
本文出自微宇宙(http://zhensheng.im),转载不标明出处者死一户口本。
Comments are closed.