Linux文件安全策略技巧

Linux文件安全策略技巧


Linux系统中文件权限简述

  • 文件或目录的访问权限分为只读、只写和可执行三种。
  • 有三种不同类型的用户可对文件或目录进行访问:文件访问者、同组用户、其他用户。
  • 每一文件或目录的访问权限都有三组,每组用三位表示,分别位文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。
    gaveu086@gaveu086-ZHAOYANG-E41-80 ~ $ ll
    总用量 700
    drwxr-xr-x 41 gaveu086 gaveu086   4096 5月  16 16:17 ./
    drwxr-xr-x  3 root     root       4096 1月  27 14:05 ../
    -rw-------  1 gaveu086 gaveu086  20264 5月  16 15:27 .bash_history
    -rw-r--r--  1 gaveu086 gaveu086    220 1月  27 14:05 .bash_logout
    -rw-r--r--  1 gaveu086 gaveu086   4000 1月  27 14:05 .bashrc
    drwx------ 19 gaveu086 gaveu086   4096 5月  15 13:42 .cache/
    drwxrwxr-x  6 gaveu086 gaveu086   4096 5月  16 15:06 .cinnamon/
    drwxr-xr-x 31 gaveu086 gaveu086   4096 4月  29 22:13 .config/
    drwx------  3 gaveu086 gaveu086   4096 1月  27 16:22 .dbus/
    -rw-r--r--  1 gaveu086 gaveu086     27 1月  27 16:22 .dmrc
    drwxrwxr-x 15 gaveu086 gaveu086   4096 4月  29 22:17 .fldigi/
    drwx------  3 gaveu086 gaveu086   4096 4月  29 22:15 .fltk/
    drwxrwxr-x  2 gaveu086 gaveu086   4096 4月   9 19:52 .frozen-bubble/
    drwx------  2 gaveu086 gaveu086   4096 5月  16 15:06 .gconf/
    -rw-------  1 gaveu086 gaveu086    761 4月  30 16:26 .gdb_history
    -rw-rw-r--  1 gaveu086 gaveu086     60 4月   1 09:35 .gdbinit
    -rw-rw-r--  1 gaveu086 gaveu086 306023 4月   1 09:34 .gdbinit-gef.py
    drwxrwxr-x  2 gaveu086 gaveu086   4096 4月  29 22:25 .get_iplayer/
    

文件权限相关命令

chmod

命令格式

chmod [-cfvR] [–help] [–version] mode file…

命令说明

Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。

u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。s表示指定的文件设置了suid位或指定目录设置了sgid位,使其在运行调用时拥有文件拥有者的权限。t表示目录设置了粘滞位,只能被属主或root写入修改文件或删除。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。

命令参数

-c : 若该文件权限确实已经更改,才显示其更改动作
-f : 若该文件权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
--help : 显示辅助说明
--version : 显示版本

以数字形式改变文件权限

chmod 新的权限 文件列表,其中数字将以二进制形式表示权限。

rwx-> 111(二进制) == 7(十进制)
r-x-> 101(二进制) == 5(十进制)
-wx-> 011(二进制) == 3(十进制)
rwxrwxrwx -> 111 111 111(二进制) == 7 7 7(十进制)[777大法好/逃]

用例:
chmod 755 test.sh -> rwxr-xr-x

以字符形式改变文件权限

chmod a+x test.shchmod +x test.sh 三种身份都赋予执行的权限。
chmod u+x test.sh只给拥有者加上可执行权限。
chmod g+x test.sh只给群组身份加上可执行权限。
chmod o+x test.sh只给其他人身份加上可执行权限。
chmod o-x test.sh只给其他人身份取消可执行权限。

chgrp

命令格式

chgrp [选项] [组] [文件]

命令功能

chgrp命令可采用群组名称或群组识别码的方式改变文件或目录的所属群组。使用权限是超级用户。

命令参数

-c 当发生改变时输出调试信息
-f 不显示错误信息
-R 处理指定目录以及其子目录下的所有文件
-v 运行时显示详细的处理信息
–dereference 作用于符号链接的指向,而不是符号链接本身
–no-dereference 作用于符号链接本身
–reference=
–help 显示帮助信息
–version 显示版本信息

用例

  1. 改变文件群组属性:
    chgrp -v gaveu hello

    [root@localhost gaveu]# ls -l
    total 12
    -rwxrwxr-x. 1 gaveu root 6554 May 14 12:54 hello
    -rw-rw-r--. 1 gaveu root  101 May 14 12:54 new.c
    [root@localhost gaveu]# chgrp -v gaveu hello
    changed group of `hello' to gaveu
    [root@localhost gaveu]# ls -l
    total 12
    -rwxrwxr-x. 1 gaveu gaveu 6554 May 14 12:54 hello
    -rw-rw-r--. 1 gaveu root   101 May 14 12:54 new.c
    
  2. 根据指定文件改变文件的群组属性
    chgrp --reference=hello new.c

    [root@localhost gaveu]# ls -l
    total 12
    -rwxrwxr-x. 1 gaveu gaveu 6554 May 14 12:54 hello
    -rw-rw-r--. 1 gaveu root   101 May 14 12:54 new.c
    [root@localhost gaveu]# chgrp --reference=hello new.c
    [root@localhost gaveu]# ls -l
    total 12
    -rwxrwxr-x. 1 gaveu gaveu 6554 May 14 12:54 hello
    -rw-rw-r--. 1 gaveu gaveu  101 May 14 12:54 new.c
    
  3. 改变指定目录以及其子目录下的所有文件的群组属性
    chgrp -R root .

    [root@localhost gaveu]# ls -l
    total 12
    -rwxrwxr-x. 1 gaveu gaveu 6554 May 14 12:54 hello
    -rw-rw-r--. 1 gaveu gaveu  101 May 14 12:54 new.c
    [root@localhost gaveu]# chgrp -R root .
    [root@localhost gaveu]# ls -l
    total 12
    -rwxrwxr-x. 1 gaveu root 6554 May 14 12:54 hello
    -rw-rw-r--. 1 gaveu root  101 May 14 12:54 new.c
    

chown

命令格式

chown [选项] [用户或组] [文件]

命令功能

更改一个或多个文件或目录的属主和属组。使用权限是超级用户。
chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或用户ID;组可以是组名或组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的目录下以后,让用户拥有使用该文件的权限。

命令参数

-dereference:受影响的是符号链接所指示的对象,而非符号链接本身。
-h, -no-dereference:会影响符号链接本身,而非符号链接所指示的目的地(当系统支持更改符号链接的所有者,此选项才有效)。
–from=目前所有者:目前组只当每个文件的所有者和组符合选项所指定的,才会更改所有者和组。其中一个可以省略,这已省略的属性就不需要符合原有的属性。
-f, –silent, –quiet:去除大部分的错误信息。
-R, –recursive:递归处理所有的文件及子目录。
-v, –verbose:处理任何文件都会显示信息。

用例

递归修改当前目录下所有文件及目录的属主:

[root@localhost gaveu]# ls -l
total 12
-rwxrwxr-x. 1 gaveu root 6554 May 14 12:54 hello
-rw-rw-r--. 1 gaveu root  101 May 14 12:54 new.c
[root@localhost gaveu]# chown -R root .
[root@localhost gaveu]# ls -l
total 12
-rwxrwxr-x. 1 root root 6554 May 14 12:54 hello
-rw-rw-r--. 1 root root  101 May 14 12:54 new.c

suid、sgid与粘滞位

suid介绍

如果一个文件有suid位,则执行这个文件时,系统将忽视当前用户的权限,而直接以文件本身的owner身份来执行。

用例

chmod g+s hello
让与文件hello属主同组的用户运行调用hello时拥有属主的权限。

[root@localhost gaveu]# ll
total 12
-rwxr--r--. 1 root root 6554 May 14 12:54 hello
-rw-rw-r--. 1 root root  101 May 14 12:54 new.c
[root@localhost gaveu]# chmod g+s hello
[root@localhost gaveu]# ls -l
total 12
-rwxr-Sr--. 1 root root 6554 May 14 12:54 hello
-rw-rw-r--. 1 root root  101 May 14 12:54 new.c

sgid介绍

如果一个目录设置了sgid,则无论是哪个用户在此文件夹下创建了文件,文件的所属组都跟文件夹的所属组一样。

用例

chmod g+s ./testDir
testDir目录设置sgid,使得与该目录属主同组的用户运行调用testDir时拥有属主权限。

[root@localhost gaveu]# ll
total 16
-rwxr--r--. 1 root root 6554 May 14 12:54 hello
-rw-rw-r--. 1 root root  101 May 14 12:54 new.c
drwxr-xr-x. 2 root root 4096 May 19 03:50 testDir
[root@localhost gaveu]# chmod g+s testDir
[root@localhost gaveu]# ls -l
total 16
-rwxr--r--. 1 root root 6554 May 14 12:54 hello
-rw-rw-r--. 1 root root  101 May 14 12:54 new.c
drwxr-sr-x. 2 root root 4096 May 19 03:50 testDir
[root@localhost gaveu]# chmod g-s testDir
[root@localhost gaveu]# ls -l
total 16
-rwxr--r--. 1 root root 6554 May 14 12:54 hello
-rw-rw-r--. 1 root root  101 May 14 12:54 new.c
drwxr-xr-x. 2 root root 4096 May 19 03:50 testDir

粘滞位

如果一个文件夹设置了粘滞位,则其中的文件只有文件的属主或者root才能删除。粘滞位将会自动屏蔽文件夹的写入权限。

用例

chmod g+t testDir/
testDir设置粘滞位,使其无法被除该目录属主和root之外的同组用户修改和删除。

[root@localhost gaveu]# chmod g+t testDir/
[root@localhost gaveu]# exit
exit
[gaveu@localhost gaveu]$ rmdir testDir/
rmdir: failed to remove `testDir/': Permission denied

ACL权限规划:setfacl与getfacl

背景

传统的linux文件系统的权限控制是通过user、group、other与r(读)、w(写)、x(执行)的不同组合来实现的。随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求。
例如,目录/data的权限为:drwxr-x—,所有者与所属组均为root,在不改变所有者的前提下,要求用户tom对该目录有完全访问权限(rwx)。考虑以下两种方法(这里假设tom不属于root组)
1. 给/data的other类别增加rwx permission,这样由于tom会被归为/other组类别,那么other组的其他用户也将拥有rwx权限。
2. 将tom加入到root group,为root group分配rwx权限,那么tom是root权限也是不合适的。
由此,传统的权限管理设置就显得力不从心了。

ACL的使用

ACL即Access Control List
主要的目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置,ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。如,某一个文件,不让单一的某个用户访问。
ACL使用两个命令来对其进行控制
getfacl:取得某个文件/目录的ACL设置项目
setfacl:设置某个文件/目录的ACL设置项目

命令getfacl

命令格式

getfacl [-参数] 文件/目录

命令功能

获取目录或文件访问控制权限列表。

命令参数

-a,  --access           仅显示文件访问控制列表  
-d, --default           仅显示默认的访问控制列表  
-c, --omit-header       不显示注释表头  
-e, --all-effective     显示所有的有效权限  
-E, --no-effective      显示无效权限  
-s, --skip-base         跳过只有基条目(base entries)的文件  
-R, --recursive         递归显示子目录  
-L, --logical           逻辑遍历(跟随符号链接)  
-P, --physical          物理遍历(不跟随符号链接)  
-t, --tabular           使用制表符分隔的输出格式  
-n, --numeric           显示数字的用户/组标识  
-p, --absolute-names    不去除路径前的 '/' 符号  
-v, --version           显示版本并退出  
-h, --help              显示本帮助信息  

命令setfacl

命令格式

setfacl [-d:] [u:]uid [:perms] 指定用户的权限,文件所有者的权限(如果uid没有指定)。
setfacl [-d:] g:gid [:perms] 指定群组的权限,文件所有群组的权限(如果gid未指定)
setfacl [-d:] -m[:] [:perms] 有效权限掩码
setfacl [-d:] o [:perms] 其他的权限
>选项-m和-x后边跟以acl规则。多条acl规则以逗号(,)隔开。选项-M和-X用来从文件或标准输入读取acl规则。
选项–set和–set-file用来设置文件或目录的acl规则,先前的设定将被覆盖。
选项-m(–modify)和-M(–modify-file)选项修改文件或目录的acl规则。
选项-x(–remove)和-X(–remove-file)选项删除acl规则。

命令功能

设置某个文件/目录的ACL设置项目。

命令参数

-b,--remove-all:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留。
-k,--remove-default:删除缺省的acl规则。如果没有缺省规则,将不提示。
-n,--no-mask:不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。
-m,--mask:重新计算有效权限,即使ACL mask被明确指定。
-d,--default:设定默认的acl规则。
--restore=file:从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除--test以外的任何参数一同执行。
--test:测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出。
-R,--recursive:递归的对所有文件及目录进行操作。
-L,--logical:跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。
-P,--physical:跳过所有符号链接,包括符号链接文件。
--version:输出setfacl的版本号并退出。
--help:输出帮助信息。
--:标识命令行参数结束,其后的所有参数都将被认为是文件名
-:如果文件名是-,则setfacl将从标准输入读取文件名。

用例

1.设置指定用户对文件的权限
setfacl -m user:gaveu:rwx ./faclTest.txt 让用户gaveu拥有对faclTest.txt的可读写可执行权限。

[gaveu@localhost testDir]$ getfacl ./faclTest.txt 
# file: faclTest.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root@localhost testDir]# setfacl -m user:gaveu:rwx ./faclTest.txt 

[root@localhost testDir]# getfacl ./faclTest.txt 
# file: faclTest.txt
# owner: root
# group: root
user::rw-
user:gaveu:rwx
group::r--
mask::rwx
other::r--

[root@localhost testDir]# ls -l
total 4
-rw-rwxr--+ 1 root root 0 May 20 01:27 faclTest.txt

可以看到的,一个文件设置了ACL权限后,其permission后面有个"+"号~

2.设置指定组对文件的权限
setfacl -m group:bin:rwx ./faclTest.txt
让组bin拥有对faclTest.txt的可读写可执行权限。

[root@localhost testDir]# setfacl -m group:bin:rwx ./faclTest.txt 

[root@localhost testDir]# getfacl ./faclTest.txt 
# file: faclTest.txt
# owner: root
# group: root
user::rw-
user:gaveu:rwx
group::r--
group:bin:rwx
mask::rwx
other::r--

3.取消指定组对文件的权限
setfacl -x group:bin ./faclTest.txt
取消组bin对文件faclTest.txt的相关ACL权限

[root@localhost testDir]# setfacl -x group:bin ./faclTest.txt 
[root@localhost testDir]# getfacl ./faclTest.txt 
# file: faclTest.txt
# owner: root
# group: root
user::rw-
user:gaveu:rwx
group::r--
mask::rwx
other::r--

4.运用Default ACL设置指定组对目录的权限
setfacl -d -m group:bin:rwx ./testDir/
让组bin拥有对目录testDir的可读写可执行权限

[root@localhost gaveu]# getfacl ./testDir/
# file: testDir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

[root@localhost gaveu]# setfacl -d -m group:bin:rwx ./testDir/

[root@localhost gaveu]# getfacl ./testDir/
# file: testDir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:bin:rwx
default:mask::rwx
default:other::r-x

文件扩展工具——chattr和lsattr

lsattr

命令格式

lsattr [参数][文件/目录路径]

命令功能

lsattr命令用于显示文件属性。
chattr执行改变文件或目录的属性,可执行lsattr指令查询其属性。

命令参数

-a  显示所有文件和目录,包括以”.”为名称开头字符的额外内建,现行目录”.”与上层目录”..”。
-d  显示,目录名称,而非其内容。
-l  此参数目前没有任何作用。
-R  递归处理,将指定目录下的所有文件及子目录一并处理。
-v  显示文件或目录版本。
-V  显示版本信息。

命令用例

  1. 使用 lsattr 命令来显示文件属性:
    lsattr ./new.c 显示new.c文件的属性

    [root@localhost gaveu]# lsattr ./new.c
    ----i--------e- ./new.c
    [root@localhost gaveu]# chattr -i new.c
    [root@localhost gaveu]# lsattr ./new.c
    -------------e- ./new.c
    

chattr

命令格式

chattr (选项) [文件/目录路径]

命令功能

chattr命令用来改变文件属性,需要root权限。这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:

a:让文件或目录仅供附加用途;
b:不更新文件或目录的最后存取时间;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得任意更动文件或目录;
s:保密性删除文件或目录;
S:即时更新文件或目录;
u:预防意外删除。

命令选项

-R:递归处理,将指令目录下的所有文件及子目录一并处理;
-v:设置文件或目录版本;
-V:显示指令执行过程;
+:开启文件或目录的该项属性;
-:关闭文件或目录的该项属性;
=:指定文件或目录的该项属性。

命令用例

  1. chattr命令防止系统中某个关键文件被修改:
    chattr -i ./new.cnew.c文件添加”不得任一更动文件或目录”的属性,从而起到防删改的效果。

    [root@localhost gaveu]# chattr +i new.c
    [root@localhost gaveu]# rm new.c
    rm: remove regular file `new.c'? y
    rm: cannot remove `new.c': Operation not permitted
    
  2. 让某个文件只能往里面追加内容,不能删除,一些日志文件适用于这种操作:
    chattr -a ./2018.log2018.log文件只能添加而不能删除信息,也不能被删除。


修改常用命令的权限

由于linux中命令的使用频度相对于windows要高得多,因而地,最好为常用的命令修改权限,建议加上”700″权限。
现列出相关目录:

bin目录

bin为binary的简写,主要放置一些系统的必备执行档,例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

/usr/bin目录

主要放置一些应用软件工具的必备执行档,例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome*、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb*、wget等。

/sbin目录

主要放置一些系统管理的必备程式,例如:cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。

/usr/sbin目录

放置一些网路管理的必备程式,例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等

查找命令

whereis (命令) 查询该命令的绝对路径