目录
一、Linux文件 安全性
1.1 /etc/passwd文件
Linux系统使用一个专门的文件 /etc/passwd 来匹配登录名与对应的 UID 值。该文件包含了一些与用户有关的信息。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
root | x | 0 | 0 | root | /root | /bin/bash |
登录用户名 | 用户密码 | 用户账户的UID | 用户账户的组ID | 用户账户的文本描述 | 用户$HOME位置 | 用户的默认shell |
/etc/passwd是一个标准的文本文件。你可以使用任何文本编辑器直接在其中进行用户管理,但这样做极其危险。选择标准的Linux用户管理工具来执行这些用户管理任务会安全许多。
1.2 /etc/shadow文件
/etc/shadow文件对Linux系统密码管理提供了更多的控制。只有root用户才能访问该文件。
1.3 添加新用户
用来向Linux系统添加新用户的主要工具是 useradd 。查看所使用的Linux发行版的系统默认值,可以使用加入了 -D 选项的 useradd 命令。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
useradd 默认值使用 /etc/default/useradd 文件设置。另外,进一步的安全设置在 /etc/login.defs 文件中定义。你可以调整这些文件,改变Linux系统默认的安全行为。
- 新用户会被添加到 GID为100的公共组
- 新用户的家目录
- 新用户账户密码在过期后不会被禁用
- 新用户不设置过期日期
- 默认shell
- 系统会将 /etc/skel 目录的内容复制到用户的 $HOME 目录
- 系统会为该用户账户在 mail 目录下创建一个用于接收邮件的文件
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# useradd -m test
-m 选项会使其创建 $HOME 目录
1.4 删除用户
userdel 命令只删除 /etc/passwd 和 /etc/shadow 文件中的用户信息,属于该用户的文件会被保留。如果加入 -r 选项,则会删除用户的 $HOME 目录及邮件目录。
警告 在有大量用户的环境中使用 -r 选项要小心。你永远不知道用户是否在个人的 $HOME 目录中存放了其他用户或程序要用到的重要文件。在删除时一定要检查。
1.5 修改用户
命令 | 描述 |
usermod | 修改用户账户字段,还可以指定主要组和辅助组的所属关系 |
passwd | 修改已有用户的密码 |
chpasswd | 从文件中读取登录名及密码并更新密码 |
chage | 修改密码的过期日期 |
chfn | 修改用户账户的备注信息 |
chsh | 修改用户账户的默认登录shell |
1.5.1 usermod
usermod 命令是用户账户修改工具中最强大的一个,提供了修改 /etc/passwd文件中大部分字段的相关选项,只需指定相应的选项即可。大部分选项与 useradd 命令选项一样(比如 -c 用于修改备注字段,-e 用户修改过期日期,-g 用户修改默认的登录组)。除此之外:
- -l:修改用户的登录名 usermod -l newname oldname
- -L:锁定账户,禁止用户登录 usermod -L username
- -U:解除锁定
- -L 选项尤为重要。该选项可以锁定账户,使用户无法登录,无须删除账户和用户数据,要恢复账户,使用-U 即可。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat /etc/passwd | grep datou
datou:x:1001:1001::/home/datou:/bin/bash
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# usermod datou -l da
usermod: user datou is currently used by process 12406
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# usermod datou -l da
usermod: user datou is currently used by process 12434
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# kill -9 12434
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# usermod datou -l da
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat /etc/passwd | grep datou
da:x:1001:1001::/home/datou:/bin/bash
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
1.5.2 passwd和chpasswd
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# passwd datou
Changing password for user datou.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
-e 选项可以强制用户下次登录时修改密码
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user datou.
Changing password for datou.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# passwd datou -e
Expiring password for user datou.
passwd: Success
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
如果需要为系统中大量用户修改密码,使用chpasswd。chpasswd 命令能从标准输入自动读取一系列以冒号分隔的登录名和密码对偶,自动对密码加密,然后为用户设置密码。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chpasswd < user.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
1.5.3 chsh、chfn 和 chage
chsh、chfn 和chage用于修改特定的账户信息。chsh命令可以修改默认的用户登录shell。使用时必须用shell的全路径作为参数,不能 只用shell名:
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chsh -s /bin/sh datou
Changing shell for datou.
Shell changed.
-sh-4.2$ whoami
datou
-sh-4.2$ echo $0
-sh
-sh-4.2$
chfn命令提供了在 /etc/passwd 文件的备注字段中保存信息的标准方法。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat /etc/passwd | grep datou
datou:x:1001:1001::/home/datou:/bin/sh
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chfn datou
Changing finger information for datou.
Name []: test_datou
Office []: datou1
Office Phone []: datou2
Home Phone []: datou3
Finger information changed.
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat /etc/passwd | grep datou
datou:x:1001:1001:test_datou,datou1,datou2,datou3:/home/datou:/bin/sh
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
最后,chage 命令可用于帮助管理用户账户的有效期,YYYY-MM-DD格式日期。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chage -E 2024-05-18 datou
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
# 设置密码过期日期
二、Linux组
用户账户在控制单个用户安全性方面还不错,但涉及共享资源的一组用户时就捉襟见肘了。为解决这个问题,Linux系统采用了另一个安全概念----组。
组权限允许多个用户对系统对象(比如文件、目录和设备等)共享一组权限。
有些Linux发行版会创建一个组,将所有的用户作为改组的成员。有些发行版会为每个用户创建一个单独的组,这样会更安全一些。
2.1 /etc/group文件
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat /etc/group | grep dat
datou:x:1001:
datou | x | 1001 | |
组名 | 组密码 | GID | 属于该组的用户列表 |
组密码允许非组内成员使用密码临时性的成为该组成员。
由于 /etc/group 文件是一个标准的文本文件,可以手动编辑该文件。但更全的做法是使用 usermod 命令向组内添加新用户。
注意 你会发现列表中的一些组没有任何用户,这并不是说这些组没有成员。当一个用户在 /etc/passwd 文件中指定某个组作为主要组时,该用户不会作为该组成员出现在 /etc/group 文件中。
2.2 创建新组
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# groupadd share
在创建新租时,默认不为其分配任何用户。groupadd 命令没有提供向组中添加新用户的选项,但可以使用 usermod 命令来解决。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# usermod -G share datou
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat /etc/group
datou:x:1001:
share:x:1002:datou
警告 为用户分配组时要格外小心。如果使用了 -g 选项。则指定的组会替换掉在 /etc/passwd 文件中为该用户分配的主要组。 -G 选项则会将该组加入用户的数组列表,不会影响主要组。
2.3 修改组
groupmod 命令可以修改已有组的GID(使用-g选项)或组名(-n 选项)
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# groupmod -n share_new share
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat /etc/group
share_new:x:1002:datou
由于所有的安全权限均基于 GID ,因此可以随意修改组名,不会影响文件的安全性。
三、文件权限
3.1 文件权限符号
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
3.2 默认文件权限
umask 命令用于设置新建文件和目录的默认权限 。umask 命令可以显示和设置默认权限。
对于文件而言,全权限值是666(所有用户都有读取和写入的权限);对目录而言,全权限值是777(所有用户都有读取、写入和执行的权限)。
所以,文件一开始的权限值是666,减去 umask 值022 之后,剩下的文件权限就是644。
umask 值通常会被设置在 /etc/profile启动文件中。你可以使用umask 命令指定其他 umask 默认值。
四、更改安全设置
4.1 修改权限
chmod 命令可以修改文件和目录的安全设置,如:
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chmod 777 user.txt
或者使用符合模式的权限:
[ugoa...][[+-=][rwxXstugo...]
- X:仅当对象是目录或者已有执行权限时才赋予执行权限
- s:在执行时设置SUID 或 SGID
- t:设置粘滞位
- u:设置属主权限
- g:设置属组权限
- o:设置其他用户权限
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chmod u+x user.txt
4.2 改变所属关系
chown 和 chgrp ,前者可以修改文件的属主,后者可以修改 文件的默认属组。
可以使用登录名或UID 来指定文件的新属主
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ll user.txt
-rw-r--r-- 1 root root 22 May 17 17:07 user.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chown datou user.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ll user.txt
-rw-r--r-- 1 datou root 22 May 17 17:07 user.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
chown 也可以同时修改文件属主和属组
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chown wahaha.share_new user.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ll user.txt
-rw-r--r-- 1 wahaha share_new 22 May 17 17:07 user.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
如果你的Linux系统使用与用户登录名相同的组名,则可以同时修改二者
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chown datou. user.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ll user.txt
-rw-r--r-- 1 datou datou 22 May 17 17:07 user.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#
4.3 共享文件
创建新文件时,Linux会用默认的UID和GID来给文件分配权限,要想让其他用户也能访问文件,要么修改所有用户一级安全权限,要么给文件分配一个包含其他用户的新默认组。
如果想在大范围内创建并共享文件,这会很烦琐。
Linux为每个文件和目录存储了3个额外的信息位。
- SUID(set user id):当用户执行该文件时,程序会以文件属主的权限运行
- SGID(set group id):对文件而言,程序会以文件属主的权限运行;对目录而言,该目录中创建的新文件会以目录属组作为默认属组
- 粘滞位(sticky bit):应用于目录时,只有文件属主可以删除或者重命名该目录的文件。SGID 位对文件共享非常重要。启用 SGID 位后,可以强制在共享目录中创建的新文件都属于该目录的数组,这个组也就成了每个用户的数组。
因此,要常见一个共享目录,使目录中所有新文件都沿用目录的数组,只需设置该目录的 SGID 位。
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# mkdir testdir
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ll
drwxr-xr-x 2 root root 4096 May 17 19:30 testdir
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chgrp share_new testdir/
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ll
drwxr-xr-x 2 root share_new 4096 May 17 19:30 testdir
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cd testdir/
# 未设置SGID位时创建文件
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]# touch testfile
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]# ll
total 0
-rw-r--r-- 1 root root 0 May 17 19:35 testfile
# 可以问价数组还是当前用户数组
# 设置SGID位之后再次创建新文件
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# chmod g+s testdir
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]# touch testfile2
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]# ll
total 0
-rw-r--r-- 1 root root 0 May 17 19:35 testfile
-rw-r--r-- 1 root share_new 0 May 17 19:38 testfile2
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]#
跟期望的一样,新文件都会沿用目录的默认属组,而不是用户账户的默认属组。
4.4 访问控制列表
Linux的基本权限方法有一个缺点:局限性。你只能将文件或目录的权限分配给单个组或者用户账户。在一个复杂的商业环境中,对于文件和目录,不同组需要不同权限,基于权限方法解决不了这个问题。
Linux开发者设计出了一种更先进的文件和目录安全方法:访问控制列表(access control list,ACL)。ACL允许指定包含多个用户或组的列表以及为其分配的权限。和基本安全方法一样,ACL权限使用相同的读取、写入和执行权限位,但现在可以分配多个用户和组。
可以使用 setfacl 命令和 getfacl 命令在Linux中实现ACL特性。
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
group::r--
other::r--
setfacl 命令允许使用 -m 选项修改分配给文件或目录的权限,或使用 -x 选项删除特定权限。
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]# setfacl -m g:share_new:rw testfile
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
group::r--
group:share_new:rw-
mask::rw-
other::r--
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]#
这个例子位testfile文件添加了 share_new 组的读写权限
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]# ll
total 0
-rw-rw-r--+ 1 root root 0 May 17 19:35 testfile
-rw-r--r-- 1 root share_new 0 May 17 19:38 testfile2
[root@iZbp1ir1vzqwzkdy7mvjthZ testdir]#
在权限位的末尾多了一个加号(+),指明该文件还应用了ACL。