摘要:网上有很多写Linux安全基线的文章,国际也有非常成熟且成体系化的安全基线配置指南(CIS-Benchmarks),但是我发现很少有人能够深入理解这些配置基线设计的目的所在。受篇幅原因,本文不会讨论所有安全配置基线设计的底层逻辑,旨在重点探讨Linux账户安全、密码安全、su使用安全以及sudo权限管理等四个方面的核心风险问题以及关键基线设计要点,希望让大家知其然也要知其所以然,并由此受到启发。
一、Linux账户安全
(一)基础知识
Linux用户分三类:超级用户(root)、普通用户、程序用户
- 超级用户:UID=0
- 程序用户:UID=1-499(Rhel5/6) UID=1-999(Rhel7以上)
- 普通用户:UID=500-65535 (Rhel5/6)UID=1000-60000(Rhel7以上)
Linux用户组分为两类:基本组、附加组
- 一个用户只能有一个基本组,最多可以有31个附加组。基本组是用户创建文件时默认的所有组,附加组主要用于权限管理。不论用户属于哪个组,用户都能拥有该组的权限。
- wheel组是一种特殊的附加组,将普通用户加入到wheel组后,被加入的这个普通用户就成了管理员组内的用户,通过修改配置文件使得只有wheel组内的用户可以切换到root用户,确保root用户安全。
备注:wheel组是个神奇般的存在,最早能够追溯到Unix系统时代。当时系统管理员也不被允许直接用root用户登录,所以Unix的开发大神们设计了这个wheel组,只有加入这个wheel组的用户才能使用su命令切换至root用户获取最高权限。这里,在国内运营商中干过运维或者安全的小伙伴们应该特别地有发言权,因为他们的系统中很多基础账户是不允许切root账号的。
Linux系统中记录用户账号及密码的文件,我相信所有人都知道吧
- /etc/passwd文件:用于存放用户账号名、UID、GID、宿主目录、登录shell
- /etc/shadow文件:用于存放用户账户名、密码、密码天数、账户失效日期等
我相信只要是搞个安全运维的人,都知道Linux账户密码文件中各个字段的具体含义,但是这里还是有必要提下,越基础越需要理解,尤其是/etc/shadow文件密码前的不同符号所代表的含义,我相信这在基础面试中问到的话,会难倒一批人。

- 字段1:用户账号的名称
- 字段2:密码字符串或密码占位符“X”
- 字段3:用户账号的UID
- 字段4:所属基本组的GID
- 字段5:用户全名或注释
- 字段6:用户主目录
- 字段7:登录shell信息

- 字段1:用户账号的名称
- 字段2:密码(加盐密码)如该字段是x表示用户无法登录到系统,
- 密码前星号(*)感叹号(!)代表用户被锁定,2个感叹号(!!)表示未设置密码
- 字段3:上次修改口令的时间(从1970年1月1日计算到最近1次修改口令时间)
- 字段4:两次修改口令最少间隔天数,如设置为0,则表示可以随时更改
- 字段5:密码过期时间,即两次修改口令最大间隔天数
- 字段6:警告期,提前多少天警告用户口令即将过期
- 字段7:宽限期,口令过期之后多少天禁用此用户
- 字段8:用户过期日期(用从1970年1月1日开始的天数表示)0或空字符表示永不过期
- 字段9:保留字段
(二)影子后门
一般来说,只有 root 用户的UID为0。如果将普通用户的UID 修改为0的话,那么只要以普通用户的用户名和密码登录,系统就会自动切换到root用户。我在亲身的工作经历中发现,这种现象并不是只有在黑客攻击的时候才会发生,我看到太多企业运维人员,为了图方便以及维持更高的操作权限,竟直接将普通用户的UID改为0,成功打上了root的擦边球。
root@security ~]# grep bin/bash /etc/passwd root:x:0:0:root:/root:/bin/bash test:x:0:0::/home/test:/bin/bash
[root@security ~]# id test uid=0(root) gid=0(root) groups=0(root)
看到了吗?test和root用户的UID、GID都是0 ,这个风险是绝对不允许存在的,所以在安全基线核查里,大家是不是看到下面这样一句代码,这就是为了找出这些潜在的root权限用户。
[root@security ~]# awk -F : ‘($3==0){print $1}’ /etc/passwd二、Linux密码安全
(一)基础知识
前面我提到了shadow文件中各个字段的含义,下面我们重点对第2个字段记录的密码值进行下深入研究,这里肯定涉及到加密算法了,其实就是用Linux明文密码和salt(16位随机盐值),通过函数crypt()完成加密,加密密文存储在/etc/shadow文件中,所以第2个字段的密文域由三部分组成,即:$id $ salt $encrypted
- id=1,表示采用MD5方式进行加密,生成密文长度:22位
- id=2,表示采
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)

