# 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 730 19:09 ./
drwxr-xr-x 21 cyan cyan 4096 730 19:09 ../
-rw-rw-r--  1 cyan cyan    0 728 15:50 new_File
-rwxrw-r--  1 cyan cyan   49 730 19:09 test*
-rwxrw-r--  1 cyan cyan   31 729 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 731 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 731 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 731 21:30 tmp.txt*
# 说明
# u: 表示用户 (属主)  g: 表示组  o: 表示其他  a: 表示所有
# +: 增加  -: 减少  =: 赋值