# Linux 安全性
Linux
安全系统核心是用户账户,用户账户通过创建用户时分配的用户 ID(UID)
来跟踪。 /etc/password
文件将用户的登录名匹配到对应的 UID
的值root
账户是 Linux
管理员,固定分配给的 UID
是 0。 Linux
会为各种各样的功能创建不同的用户账户,这些账户不是真正的用户,而是系统账户,是系统上运行各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个系统用户账户登录到 Linux 系统上!!在意识到安全问题之前,许多服务都用 root
登陆,如果其中一个服务被攻陷, root
权限就会被入侵。
/etc/shadow
文件,该文件记录各个账户之间密码记录。该文件只有 root
才有权限操作,所以如果我们不是 root
用户登录,就需要使用 sudo
命令。
cyan@cyan-virtual-machine:~$ sudo cat /etc/shadow | |
[sudo] password for cyan: | |
root:!:18999:0:99999:7::: | |
# 其他信息就不展示了 |
每一行就是一个用户,分为九个字段,分别是: 参考文章传送门
- 与
/etc/passwd
文件中对应的登录名。 - 加密后的密码,也就是说,你不能直接看到这个密码。
- 自上次修改密码后过去的天数,上面的
root
是 18999,就是从 1970.1.1 不断累加得到的时间,可以使用命令date -d "1970-01-01 18999 days"
查看具体时间。 - 最小修改时间间隔,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。
- 密码有效期,默认值为 99999,也就是 273 年。
- 密码需要变更前的警告天数,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 "再过 n 天你的密码就要过期了,请尽快重新设置你的密码!"。
- 密码过期后的宽限天数,过期后,在宽限天数内还是可以登录。
- 账号失效时间,该字段通常被使用在具有收费服务的系统中。
- 最后一个,保留,还没有使用。
# 添加新用户
使用 useradd
命令,可以一次性创建新用户账户及设置用户 HOME
目录结构。 useradd
命令使用系统默认值以及命令行参数设置用户账户。
系统默认值被设置在 /etc/default/useradd
,可以使用 useradd -D
检查默认值
cyan@cyan-virtual-machine:~$ useradd -D | |
GROUP=100 # 新用户被添加到 GID=100 的公共组 | |
HOME=/home # 新的 home 目录位于 /home/loginname | |
INACTIVE=-1 # 密码过期后不会被禁用 | |
EXPIRE= # 未设置过期日期 | |
SHELL=/bin/sh | |
SKEL=/etc/skel # 将 /etc/skel 目录下内容复制到用户的 home 下 | |
CREATE_MAIL_SPOOL=no # 是否为该用户在 mail 目录下创建一个接受邮件的文件 |
上述的系统默认值是可以更改的,在 useradd
时,加入参数进行更改
-b default_home # 更改默认的创建用户 HOME 目录的位置 | |
-e expirtion_date # 更改默认的新账户的过期日期 | |
-f inactive # 更改默认的新用户从密码过期到账户被禁用的天数 | |
-g group # 更改默认的组名称或 GID | |
-s shell # 更改默认登录 shell |
# 删除用户
userdel
命令,默认情况下只会删除 /etc/passwd
文件中的用户信息,而不会删除系统中属于该账户的任何文件, userdel -r
会删除用户的 HOME 目录以及邮件目录。
# 修改用户
usermod,chsh,chfn,chage
这几个指令要用到再自己百度,平时用不到,隔不了多久就会忘记。
# Linux 组
linux 通过将具有相同特性的用户划归为一个组,可以大大简化用户的管理,方便用户之间文件的共享。任何一个用户都至少属于一个组,这个组称为初始组,可以同时属于多个附加组。用户不仅拥有初始组的权限,还拥有附加组的权限。
在 /etc/group
文件中,包含系统上用到的每个组的信息,4 个字段:组名:组密码:GID: 属于该组的用户列表
用户列表中某些组没有列出用户,并不代表没有成员,只是加入了成员,不会出现在该文件中。
# 创建组 | |
groupadd 组名 | |
# 后期将成员加入到指定组 | |
usermod -G 组名 成员名 |
# 文件权限
在本系列第一篇文章中,为了运行一个新建脚本,需要使用 chmod u+x 文件名
。查看一个文件,我们可以使用 ll
cyan@cyan-virtual-machine:~/Templates$ ll | |
total 16 | |
drwxr-xr-x 2 cyan cyan 4096 7月 30 19:09 ./ | |
drwxr-xr-x 21 cyan cyan 4096 7月 30 19:09 ../ | |
-rw-rw-r-- 1 cyan cyan 0 7月 28 15:50 new_File | |
-rwxrw-r-- 1 cyan cyan 49 7月 30 19:09 test* | |
-rwxrw-r-- 1 cyan cyan 31 7月 29 16:18 test_1.sh* |
得到的结果中,第一位有些是 d
,有些是 -
。第一个代表了文件 (-)/ 目录 (d)/ 链接 (l)/ 字符型设备 (c)/ 块设备 (b)/ 网络设备 (n)。
后面一共是 9 位,每 3 位为一个部分(分别表示 rwx),这三个部分依次属于文件属主(创建文件的用户),属组成员,其他用户权限。
目录或者文件一开始创建时,会授予默认权限,默认权限与 umask
值有关。三个用户权限(三个部分)各自占用一个八进制位(0-7),一个部分的权限从 '---'
到 'rwx'
在八进制位中表示为 0-7
,如 rw-
就是 6。三个部分合在一个,就是 000-777
,也就是 ---------到rwxrwxrwx
。
umask
命令用于设置创建文件或是目录的默认权限,我们先在终端输入 umask
命令
cyan@cyan-virtual-machine:~/Templates$ umask | |
0002 | |
# 你的终端可能会输出 0022,我好像是在环境文件做过持久化更改(有点记不清了) |
第一位是一个关于特殊权限的位,可以暂时不管。后面三个与默认权限有关。
对于文件而言,默认的最大权限就是 666
,也就是 rw-rw-rw-
,目录的默认最大权限是 777
。如果你学过计算机网络,你会知道掩码这个东西。这里就是,最大默认权限减去掩码就会得到文件(目录)创建时赋予的权限。
比如我的掩码 umask=0002
,那么创建文件时, 666-002=664
,得到的权限就是 rw-rw-r--
验证一下
cyan@cyan-virtual-machine:~/Templates$ touch tmp.txt | |
cyan@cyan-virtual-machine:~/Templates$ ll tmp.txt | |
-rw-rw-r-- 1 cyan cyan 0 7月 31 21:30 tmp.txt | |
cyan@cyan-virtual-machine:~/Templates$ umask | |
0002 |
这里有一篇文章参考。
# 更改权限
通过 chmod
命令,可以修改文件的权限
# chmod 3 位八进制权限码 文件名 | |
cyan@cyan-virtual-machine:~/Templates$ chmod 777 tmp.txt | |
cyan@cyan-virtual-machine:~/Templates$ ll tmp.txt | |
-rwxrwxrwx 1 cyan cyan 0 7月 31 21:30 tmp.txt* |
如果你只是想改变某一部分(属主,组内用户,其他用户)的权限,可以使用
chmod u+x 文件名 # 属主增加执行权限 | |
chmod g-rx 文件名 # 组内用户减少 | |
chmod o=rwx 文件名 # 其他用户的权限为 rwx | |
# 举例 | |
cyan@cyan-virtual-machine:~/Templates$ chmod g-rx tmp.txt | |
cyan@cyan-virtual-machine:~/Templates$ ll tmp.txt | |
-rwx-w-rwx 1 cyan cyan 0 7月 31 21:30 tmp.txt* | |
# 说明 | |
# u: 表示用户 (属主) g: 表示组 o: 表示其他 a: 表示所有 | |
# +: 增加 -: 减少 =: 赋值 |