1. 安全3A

1. 安全3A

Authentication:认证
Authorization:授权
Accouting|Audition:审计

2. 用户user

  • 令牌token,identity
  • Linux用户:Username/UID
  • 管理员:root, 0
  • 普通用户:1-60000 自动分配
    • 系统用户:1-499(centos6), 1-999 (CentOS7)
      • 对守护进程获取资源进行权限分配
    • 登录用户:500及以上(cenots6), 1000及以上(CentOS7)
      • 交互式登录

2.1. 注意点1:

  1. 用户一旦登陆成功便会收到一个令牌token.在linux中令牌包含这个用户获得的uid号gid号等等信息;
    当用户访问文件的时候,文件便会查看这个token,看其中的UID等来,判断这个用户是否能进行文件操作
  2. 但是注意如果已经登录后再改变这个UID号,然后去访问文件,如果token并没有这个权限,仍然不能访问。因为token是在登陆的时候获得的,必须重新登录才可。
  3. 系统账号是开机自动运行的进程,用于系统进程登陆使用
  4. 普通用户则是给人交互式界面登录用的

3. 组group

  • Linux组:Groupname/GID
  • 管理员组:root, 0
  • 普通组:
    • 系统组:1-499(cenots6), 1-999(CENTOS7)
    • 普通组:500+(centos6), 1000+(CENTOS7)

3.1. 注意点2:

  1. windows用户和组不能同名,但是linux中可以
  2. linux中就算一个用户加入到管理员root组内,但这个用户并不代表就是管理员了,只是说拥有了管理员组的权限(管理员组的权限不是管理员权限,它俩并不一样)。是不是管理员只有一个判断标准,就是UID是否为0.

4. linux组的类别

  • 用户的主要组(primary group)
    • 用户必须属于一个且只有一个主组(必须)
    • 组名同用户名,且仅包含一个用户,这样的组也被叫做私有组
  • 用户的附加组(supplementary group)
    • 一个用户可以属于零个或多个辅助组(非必须)

4.1. 注意点3:

  1. linux默认创建用户的时候创建一个同名的组,成为它的主组,默认也是私有组。(windows新用户则默认加入users组中去,并不每一个新用户都创建一个新的组)
  2. 如果想要更改默认设置,可以在配置文件中修改。
  3. 用户继承它所加入的组的权限,不论是主组还是附加组都继承

5. 安全上下文

  • Linux安全上下文
  • 运行中的程序:进程 (process)
    以进程发起者的身份运行:
    • root: /bin/cat
    • zhang: /bin/cat
  • 注意:进程所能够访问资源的权限取决于进程的运行者的身份,而不是进程本身的权限

6. 用户和组的配置文件—{getent}

主要有四个:

  • /etc/passwd:用户及其属性信息(名称、 UID、主组ID等)
  • /etc/shadow:用户密码及其相关属性
  • /etc/group:组及其属性信息
  • /etc/gshadow:组密码及其相关属性

6.1. 注意点4:

  1. 尽量不要直接修改这些文件,注意格式问题,建议使用命令修改;
  2. 这四个文件中前两个是存放用户信息的,后两个是存放组信息的;同时一个是存放属性信息,一个存放密码信息;这样记忆比较好记。
  3. 查找某个用户名或者组名的信息,参考下面的命令
getent passwd|shadow|group|gshadow username|groupname 1.这个命令的作用是查看系统和网络上保存的数据库内的信息,基本上就是上面的这种用法; 2.当然数据库不仅仅只有上面这四个数据库; 3.更加具体的内容查看帮助;

7. passwd文件—{chfn,finger,chsh}

7.1. passwd以冒号:分隔的各项内容

  • login name:登录用名(wang)
  • passwd:密码 (x)
  • UID:用户身份编号 (1000)
  • GID:登录默认所在组编号 (1000)(主组编号)
  • GECOS:用户全名或注释
  • home directory:用户主目录 (/home/wang)
  • shell:用户默认使用shell (/bin/bash)

7.2. 注意点5:

  1. 密码部分并不保存在这里,这里保留密码位置为x是为了兼顾旧linux版本系统。密码保存位置在shadow中。

  2. 如果在这里修改UID,必须重新登陆后获取新的token才能生效

  3. 如果没有任何一个UID为0,即为系统没有管理员,则系统无法启动

  4. GID显示的是主组编号

  5. 默认家目录在home下,默认shell为bash

  6. /sbin/nologin :用于给系统进程运行使用的shell,非交互式登录;如果普通用户改成这个,则无法登陆了

  7. 修改或者添加用户的注释(指纹finger,基本上也就是passwd第五项)信息可以用下面的命令:

    chfn username: 可以修改描述信息 finger username: 可以更加详细查看用户各种信息(比从文件中查看更加简洁明了); 默认没有安装此软件的话可以先安装一下。rpm -ivh chsh -s shell username :可以用来更改用户名使用的shell类型 可以先用 cat /etc/shells 或者 chsh -l 命令查看shell类型避免改错;但有一个特殊的 就是/sbin/nologin.

8. shadow文件—{passwd,chage}

8.1. shadow以冒号:分隔的各项内容

  • 登录用名
  • 用户密码:一般用sha512($6)加密,老系统用的MD5($1)不安全
  • 从1970年1月1日起到密码最近一次被更改的时间的天数;这一项改为0的话有特殊意义,代表这个用户下一次登录之后必须修改密码
  • 最小密码使用时间:密码修改后最少要使用的天数,在此天数内不可修改(0表示随时可被变更)
  • 最大的密码使用时间:密码最多能用多少天(99999默认为273年),注意这个时间是从第三个filed,也就是最近一次修改密码的时间算起,如果时间过期了则登陆时则要求更改,并会提前提醒
  • 密码过期前几天系统提醒用户(默认为一周)
  • 密码过期几天后帐号会被锁定,在这个期限内仍然可用旧密码,但过了这个时间将无法登录也无法修改,要注意;默认是空值,表示密码就算过期了也并不强制修改密码
  • 从1970年1月1日算起,多少天后这个帐号过期失效;这一项不能使用0,(默认)用空值来表示账号永远不会失效。
  • 保留的field,并未被使用

8.2. 各种时间轴图解

用户和组插图

8.3. 注意点6:

  1. passwd [用户名]:更改用户口令

  2. getent shadow zhang:可以选择某一行查看,以zhang开头的

  3. 口令前面的!表示锁定此账号,无法登陆. 两个叹号表示双重锁定

    • 如果口令处!被删除,变成空字符,则登陆的时候直接不需要密码就可以
    • usermod -L 用户名锁定账号 ,usermod -U 用户名 解锁账号。
    • 如果一个用户口令处只有!!,没有密码,则删除!的时候只能在shadow文件中进行,如果用指令usermod -U ,没有密码的话会无法使用这个命令,必须先设置了密码之后才能解锁(早期版本比如Centos5则就算密码是空的也能进行解锁)。
  4. chage 用户名 :用来更改用户的各种时间

    • 其中的各项时间,如果设置为-1,则代表空,也就是移除各种时间,在shadows文件中把对应的一项改成empty);
    • 命令后面不加参数只加用户名的话,则需要更改所有的项目
    • 可以chage 参数 时间 用户名来修改特定的时间项目
    • 更加详细的查看它的帮助即可。
    举例:设置账号过期时间:设置到从当前时间算起的,180天以后(可以用YYYY-MM-DD的方式,详细看帮助) chage -E $(date -d +180days +%Y-%m-%d) 用户名 或者 chage -E $(date -d +180days +%F) 用户名
  5. 注意账号过期时间和密码过期时间(密码最大使用时间),它俩是不一样的;

    • 密码过期后(并且也经过了密码过期后的强制锁定时间),这个账号无法使用密码登录,不代表不能通过其他方式登录
    • 账号过期后,这个账号则无法登录

9. 密码加密—{authconfig,/etc/urandom,head}

  • 加密机制:
    • 加密:明文–> 密文
    • 解密:密文–> 明文
  • 单向加密:哈希算法,原文不同,密文必不同
    • 相同算法定长输出,获得密文不可逆推出原始数据
    • 雪崩效应:初始条件的微小改变,引起结果的巨大改变
    • md5: message digest, 128bits
    • sha1: secure hash algorithm, 160bits
    • sha224: 224bits
    • sha256: 256bits
    • sha384: 384bits
    • sha512: 512bits

9.1. 更改加密算法:

authconfig --passalgo=sha256 --update

9.2. 密码的复杂性策略

  • 足够长
  • 使用数字、大写字母、小写字母及特殊字符中至少3种
  • 使用随机密码
  • 定期更换,不要使用最近曾经使用过的密码

9.3. 生成随机字符(密码)

```
cat /dev/urandom | tr -dc '0-9a-zA-Z' | head -c20
cat /dev/urandom | tr -dc '[:graph:]' | head -c20

openssl rand -base64 20
```

10. group文件—{newgrp}

10.1. group以冒号:分隔的各项内容

  • 群组名称:就是群组名称
  • 群组密码:通常不需要设定,密码是被记录在 /etc/gshadow
  • GID:就是群组的 ID
  • 当前组包含的所有的用户列表(包括以它为主组或附加组的所有用户,分隔符为逗号),必须与gshadow里面的相同

10.2. 注意点7:

  1. id 用户名:命令的结果第三项,也就是groups组的信息;其中的第一项就是当前用户的主组,后面是附加组。
  2. 用户的主组判别是靠它的GID(id命令的第二项),它存放在passwd中,和group存放的没有关系
  3. 通常组不设置密码是因为组如果设置了密码,则用户在知道密码的前提下可以将自己添加进某个组里面,获得权限,因此不安全。不设置密码则只有管理员才可以设置某个用户能添加到哪个组里面去。
  4. 同样的类似用户命令,可用gpasswd更改组口令
  5. 当一个用户用 newgrp 组名 命令时,则可以把自己临时加入这个组,并修改自己的主组为这个组,原先的组变为附加组,退出的时候用exit.
    • 这样做的话,可以让当创建文件的时候,文件属于用户,但是文件的所属组则变为临时加入的这个组了。
    • 当用户退出登录的时候,自己的主组又变回了之前的,因此这个只是暂时的命令。
    • 现在一般不这样做了,因为加入一个新的组或者切换自己的主组需要组设置密码等等(参考newgrp命令,也可以切换主组,不过一般不用这个命令),这样会导致系统的不安全,因此我们组一般不设置密码,也就不会进行这样的操作了。

11. gshadow文件

11.1. gshadow以冒号:分隔的各项内容

  • 群组名称:就是群的名称
  • 群组密码:
  • 组管理员列表:组管理员的列表,可以更改组密码和成员
  • 当前组包含的所有的用户列表(包括以它为主组或附加组的所有用户):多个用户间用逗号分隔,必须和group中的一致

12. 直接进行密码文件操作—{vipw,vigr,pwck,grpck}

  • vipw vigr :进行文件的修改
  • pwck grpck :语法检查工具;检查格式是否有问题

注意:尽量不要用这些命令进行修改

13. 用户和组的管理命令—{useradd,usermod,userdel,groupadd,groupmod,groupdel}

  • 用户管理命令
    • useradd
    • usermod
    • userdel
  • 组帐号维护命令
    • groupadd
    • groupmod
    • groupdel

14. 创建新用户—{useradd}

useradd [options] LOGIN -u UID :指定创建的用户的uid编号 -o :配合-u 选项,不检查UID的唯一性,相当于同一个用户(同一个UID),相同的权限,不同的名字 -g GID :指明用户所属基本组,可为组名,也可以是GID编号 -c "COMMENT“ :用户的注释信息 -d HOME_DIR :以指定的路径(不存在)为家目录,不存在则会创建并把标准家名改为它 -s SHELL :指明用户的默认shell程序,可用列表在/etc/shells文件中 -G GROUP1[,GROUP2,...] :为用户指明附加组,组须事先存在 -N : 不创建私有组做主组,使用/etc/defaults/useradd中的GROUP变量(默认是users组,GID是100)做为主组;这点有点类似windows创建新用户的操作 -r :创建系统用户,也就是说创建的时候控制UID数值 CentOS 6: ID< 500,CentOS 7: ID< 1000 ,并且不创建家目录;此参数具体参考的默认值查看man帮助 -m :创建家目录,用于系统用户强行创建家目录 -M :不创建家目录,用于普通用户不给它创建家目录

14.1. 注意点8:

  1. 可以用以下一些命令来参考学习useradd命令:

    • rpm -q --scripts postfix 参考增加用户时的操作命令;
    • cat /etc/login.defs 用户创建的时候默认的各种属性信息配置
    • cat /etc/default/useradd 查看增加用户的时候默认添加的用户信息,包括shell类型,home家目录位置等等
  2. 删除用户默认不会删除它的家目录

  3. 创建系统用户用-r 但是用-r的时候它不会自己创建家目录(不用-r的时候系统默认创建家目录),即使你用-d 指定了家目录用-r时也不会创建.

    • 可以同时配合-u自己指定UID,同时配合-d指定家目录;但是并不会创建
    • 不让它创建家目录的好处就是,默认创建的家目录里面含有许多隐藏文件(默认配置),为了给某些系统服务使用的账号,最好不要让它的家目录里面含有这些隐藏文件,避免出现问题;
  4. 家目录默认创建在/home 内 ,邮箱默认创建在 /var/spool/mail

  5. 用-m强行创建家目录给系统用户

    • useradd -s /sbin/nologin -r -m nginx
    • 创建nginx系统用户,并强行创建家目录
    # Add the "apache" group and user /usr/sbin/groupadd -g 48 -r apache 2> /dev/null || : /usr/sbin/useradd -c "Apache" -u 48 -g apache \ -s /sbin/nologin -r -d /usr/share/httpd apache 2> /dev/null || :

15. useradd一些相关文件和位置及命令—{/etc/defaults/useradd,/etc/skel,/etc/login.defs}

  • 显示或更改默认设置
useradd -D useradd –D -s SHELL useradd –D –b BASE_DIR useradd –D –g GROUP
  • /etc/default/useradd:用户相关信息默认值设定
  • /etc/skel/ :用户家目录的模板来源
  • /etc/login.defs :创建用户的默认的各种系统设置

16. 批量创建或者更新用户和密码信息—{newusers,chpasswd}

  • newusers :批量创建用户;后面默认是标准输入,但也可以用和/etc/passwd相同行的文件格式的文件来批量创建或者更新用户;
  • chpasswd :批量修改用户口令,这个命令本身是标准键盘输入的 ;默认格式是用户名:密码
  • 举例:
    # newusers usersfile # 其中 cat userfile postfix:x:89:89::/var/spool/postfix:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin zhang:x:1000:1000:zhang,zhang,166,166:/home/zhang:/bin/bash **** 即每一行 和/etc/passwd 的格式一样 ------------------- # cat /data/passwd_update | chpasswd # 或者 chpasswd < /data/passwd_update # 其中 cat /data/passwd_update zhang:213weaf wang:12faefwe postfix:fefef **** 即每一行都是 用户名:密码 的格式来进行批量更新密码; **** 但这个命令不能直接跟文件,那就只能用重定向方式了

17. 用户属性修改—{usermod}

usermod [OPTION] login -u UID: 新UID -g GID: 新主组 -G GROUP1[,GROUP2,...[,GROUPN]]]:新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项;如果想要删掉所有附加组,则组的部分使用空字符""即可,或者再加一次自己的主组,则覆盖掉其他的附加组 -s SHELL:新的默认SHELL -c 'COMMENT':新的注释信息 -d HOME: 新家目录不会自动创建;若要创建新家目录并移动原家数据, 同时使用-m选项 -l login_name: 新的名字,但是没有改家目录名字 -L: lock指定用户,在/etc/shadow 密码栏的增加 ! -U: unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉 -e YYYY-MM-DD: 指明用户账号过期日期 -f INACTIVE: 设定非活动期限

18. 删除用户—{userdel}

userdel [OPTION]... login -r: 同时删除用户家目录和邮箱目录 ,慎用!!因为有可能数据仍旧需要 也就是删除 /home/用户名 /var/spool/mail/用户名

18.1. 注意点9:

  1. 慎用-r选项删除用户的数据,如果用户不想使用,可以不用删除,直接把它过期就行了;可以用chage [-E] 时间 用户名或者usermod -e 时间 用户名
  2. 如果删除了用户,不同时删除家目录和邮箱目录,则家目录和邮箱目录的所有者和所有组变为被删除的所有者所有组的编号(没有用户名和组名了
    • 如果此时新创建了一个用户(或者组)刚好用了这个编号(创建的时候指定编号,不创建默认家目录),则这个家目录则会变成新建的这个用户或者组的家目录。
    • 由此也可以看出,所有者所有组都是看UID和GID 和用户名组名没关系。
  3. /etc/passwd文件的作用并不意味着仅跟踪用户帐户。跟踪用户名和密码的作用是/etc/shadow文件的责任。当系统列出磁盘中的文件时,诸如/etc/passwd/etc/group等文件实际上是为了提供一个易于理解的名称。
    • 记住文件是使用UID / GID的非实际名称写入磁盘的。

19. 查看用户相关ID信息—{id}

id [OPTION]... [USER] -u: 显示UID -g: 显示GID -G: 显示用户所属的组的ID -n: 显示名称,需配合ugG使用

19.1. 注意点9:

  1. 可用id命令在脚本中判断用户是否存在(创建用户的时候提前判断是否有同名用户存在,然后做进一步操作 id #### &>/dev/null)

20. 切换用户—{su}

su [options...] [-] [user [args...]] 切换用户的方式: su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录 su - UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换 选项:-l --login su -l UserName 相当于 su - UserName 详细的环境初始化具体都有哪些,查看man帮助 常用举例: 换个身份执行命令(然后返回当前用户): su [-] UserName -c 'COMMAND'

20.1. 注意点10:

  1. 切换用户后需要输入exit退出,不要一直嵌套切换
  2. root su至其他用户无须密码;非root用户切换时需要密码

21. 和用户密码shadow修改相关的两个命令—{passwd,chage}

21.1. 更改口令—{passwd}

passwd [OPTIONS] UserName: 修改指定用户的密码 常用选项: -d:删除指定用户密码 -l:锁定指定用户 -u:解锁指定用户 -e:强制用户下次登录修改密码 -f:强制操作 -n mindays:指定最短使用期限 -x maxdays:最大使用期限 -w warndays:提前多少天开始警告 -i inactivedays:非活动期限 --stdin:从标准输入接收用户密码 示例:echo "PASSWORD" | passwd --stdin USERNAME 常用举例: 1.强制用户下次登录修改口令: passwd -e username 或者chage -d 0 username

21.2. 更改shadow后面的时间

chage [OPTION]... LOGIN -d LAST_DAY -E --expiredate EXPIRE_DATE -I --inactive INACTIVE -m --mindays MIN_DAYS -M --maxdays MAX_DAYS -W --warndays WARN_DAYS -l 显示密码策略 示例: chage -d 0 zhang 下一次登录强制重设密码 chage -m 0 –M 42 –W 14 –I 7 zhang chage -E 2016-09-10 zhang !注意!:chage命令没有选项,直接后面写用户名的的时候,将会交互式让你一个一个输入

22. 组的操作—{groupadd}

groupadd [OPTION]... group_name -g GID 指明GID号;[GID_MIN, GID_MAX] -r 创建系统组 CentOS 6: ID< 500 CentOS 7: ID< 1000

22.1. 注意点11

  1. 有时候为了组和用户ID一致,会采取下面的命令,尤其是在脚本中和软件安装脚本中等等:
    groupadd -g 1234 -r duan 2>/dev/null useradd -g duan -u 1234 -r duanduan 2>/dev/null *** 这里加-r是系统用户系统组的意思,不创建家目录;

23. 组属性修改—{groupmod}

groupmod [OPTION]... group -n group_name: 新名字 -g GID: 新的GID

24. 组删除—{groupdel}

groupdel GROUP

24.1. 注意点12:

  1. 删除组的时候,如果这个组是某个组的主组,则不能删除;但如果仅仅是附加组,没有用户把它作为主组,则可以删除。

25. 和组密码gshadow相关的命令—{gpasswd,groupmems,groups}

25.1. 修改组密码—{gpasswd}

gpasswd [OPTION] GROUP -a user 将user添加至指定组中,注意是附加组 -d user 从指定组中移除用户user -A user1,user2,... 设置有管理权限的用户列表 -r 删除组的密码 -R 重新严格要求组(加锁),只有组内的成员才能够用newgrp命令切换到此组为主组

25.2. 临时切换主组—{newgrp}

  • 如果用户本不属于此组,则需要组密码才能切换;如果用户已经把这个组添加为附加组,则不需要密码.
  • 如果组既没有密码(密码为空),而且用户也不是这个组的附加成员,则用户无法切换为此组为主组。

25.3. 组的成员—{groupmems}

groupmems [options] [action] options: -g, --group groupname 更改为指定组 (只有root) Actions: -a, --add username 指定用户加入组,附加组 -d, --delete username 从组中删除用户,附加组 -p, --purge 从组中清除所有成员 -l, --list 显示组成员列表

25.4. 查看用户所属组—{groups}

groups [OPTION].[USERNAME]... 查看单个用户所属的所有组列表

25.5. 可以用usermod ,gpasswd ,groupmems添加组成员

注意:只有usermod可以更改主组,另外两个指令都是增添副组 usermod -aG groups username gpasswd -a username groups

最后修改日期: 2021年7月7日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。