关于Linux账户信息安全最深入的剖析了,安芯网盾技术人员ZP(代号)工作之余整理总结,不看后悔!
背景
账户是任何系统必不可少的基础,也是主机安全的第一道防线,用户权限配置不合理会带来严重的安全问题。在类Unix系统中,一切皆文件,拥有了权限即可读取一切想要的内容。所以用户权限配置是保障系统安全的基石。2019年07月27日公布的漏洞CVE-2019-14287,是一个针对于1.8.28之前版本的sudo漏洞,破坏者可以通过此漏洞得到操作系统的最高权限。
账户安全的意义
什么是账户
GNU/Linux 通过用户和用户组进行访问控制,Linux 默认的访问控制机制相对简单直接。
用户一般指使用计算机的人。计算机给每个用户分配了用户名,用户使用这些名称访问计算机。除了人之外,一些系统服务也会建立账户,用于管理服务进程。
Linux默认会存在root用户,root用户拥有系统的最高权限,可以进行一切操作,而其他账号只能拥有部分权限。
Linux有组的概念,使用者可以通过修改组的权限对更多成员进行访问控制,每个用户必须是一个组的成员,这个组成为主属组,每个用户只能拥有一个主属组,但可以拥有多个从属组。
Linux通过useradd命令新增用户,通过userdel删除用户。UNIX中一切皆文件,所以最后所有的修改最终都会以文件的形式展示。你可以通过命令pwck –s检查用户配置文件(数据库)的完整性。
账户安全配置保证资产安全
Linux通过访问权限控制用户可以查看的内容,使用ls –l命令可以看到如下内容
里面标识了每个文件的所属用户,所属组,用户访问权限,组访问权限,非所属用户和所属组访问权限,文件大小,最后修改时间的信息。访问权限包括文件的读(r)写(w)执行(x)权限。控制好文件的访问权限可以有效防止数据泄露。
有时候安装一个新的软件都会自动创建一个用户和同名的组,这些软件一般是为用户提供服务的或者为网络上的用户提供Web服务、邮件服务等,这些软件就运行在它的组里,这样即便是软件受到了外界的攻击,也无法破坏非软件所属用户之外用户的文件。同样它也会建立一个只属于这个账户的目录,防止别的用户篡改。这些用户一般都是不可登录,并且不能使用密码,杜绝了通过爆破密码进入计算机。下表是一些用户组和其影响文件的信息。
下面这些文件不建议手动编辑。用相关工具编辑更好,这样可以避免文件错误。
账户配置
账户基本信息
账号的基本信息存储在/etc/passwd。在这个文件中每个用户的帐号信息存储一行,帐号信息由七个字段组成,字段之间用冒号(":")分隔,从左至右分别表示为:帐号,密码,用户ID,组ID,用户介绍, home目录,默认shell。
1. name:password:UID:GID:GECOS:directory:shell
字段的详细描述如下:
· 账号:用户名,不能为空,不能包含大写字母,而且要符合标准的UNIX命名规则;
· 密码:加密的用户密码,或者星号,但实际上这个位置通常为"x",这里有所特殊,后面会详细介绍
· 用户ID:每个用户和组有一个对应的UID和GID(用户ID和组ID)。一般情况,第一个非root用户的默认UID是1000,后续创建的用户UID也应大于1000,特定用户的GID应该属于指定的首要组,组的ID数值列在/etc/group文件里。
· 组ID:用户的主要组ID
· 用户介绍:可为空,通常为账号使用者的信息,如使用者姓名,Email等,使用英文逗号(",")分割
· home目录:用于登录命令设置$HOME环境变量。某些服务的用户主目录设置为"/"是安全的,但不建议普通用户设置为此目录。
· 默认shell:登录时运行的程序(如果为空,则使用 /bin/sh作为默认shell)。如果设为不存在的执行(程序),用户不能通过login登录。
在新版Linux中使用shadow文件存储密码。passwd文件对所有人可读,在里面存储密码(无论是否加密过)是很不安全的。在password字段,通常使用一个占位字符(x)代替。加密过的密码储存在/etc/shadow文件,该文件对普通用户限制访问。
示例:
1. jack1001JackSmith,some comment here,,:/home/jack:/bin/bash
分解说明:用户登录名为jack,密码保存在/etc/shadow,UID为1001,首要组的ID是100 (users组),全名Jack Smith并加了一些注释,主目录是/home/jack,使用Bash作为默认shell。
账户密码信息
/etc/shadow是用户存储账号安全信息的文件,其中包括密码、账号过期时间等设置,此文件是普通用户无法进行任何操作,在一定程度上保证了安全。
/etc/shadow文件每行包含9个字段,同样使用冒号(":")分隔,分别为登录名,加密密码,上次密码更改时间,密码不得更改天数,最长密码使用天数,密码警告期,密码闲置期,账户到期时间,保留字段。下面详细介绍每个字段的意义:
· 登录名:与/etc/passwd的账号相同,用于登录使用;
· 加密密码:经过crypt加密后的密码;
· 上次密码更改时间:最后一次修改密码的时间,表示自1970年1月1日以来的天数。值0具有特殊含义,即用户下次登录系统时应更改其密码。空字段表示密码老化功能已禁用。
· 密码不得更改天数:此字段表示在此天数之前不能修改密码,是与上次密码更改时间的间隔天数。空字段和值为0表示没有任何时间都可以修改。
· 最长密码使用天数:用户经过此天数必须修改密码。经过此天数后,密码可能仍然有效。需要用户在下次登录时更改其密码。空字段表示没有最长密码使用期限,没有密码警告期和密码闲置期(请参阅下文)。如果最大密码使用期限小于最小密码使用期限,则用户无法更改其密码。
· 密码警告期:在此期间提醒用户修改密码,空字段和值为0表示没有密码警告期。
· 密码闲置期:密码过期后的天数(请参见上面的最长密码使用期限),在此期间仍应接受密码(用户应在下次登录时更新其密码)。密码过期且经过了此过期时间后,将无法使用当前用户的密码登录。用户应联系管理员。
· 账户到期时间:此字段表示自1970年1月1日以来的天数。请注意,账户有效期与密码有效期不同。如果账户到期,则不允许用户登录。如果密码到期,则不允许用户使用其密码登录。空字段表示该账户永不过期。不应使用值0,因为它将被解释为账户于1970年1月1日到期。
· 保留字段:该字段保留供将来使用,现在暂未启用。
用户组信息
Linux中每个用户都必须有一个所属组,并且只能有一个,但可以有多个从属组。所属组在passwd文件中的第四个字段设置,从属组在group文件中设置。
Group文件介绍
与其他文件类似,group文件同样是每个组占用一行,并使用冒号分割为4个字段。分别为组名,密码,组ID,组中用户。下面详细介绍每个字段的意义:
· 组名:组名
· 密码:与passwd文件类似,加密的组用户密码,或者星号,但实际这个位置通常为"x"有所特殊。
· 组ID:组的数字标识。
· 组中用户:组内所有成员的用户名,以逗号分隔。
Gshadow文件介绍
Gshadow文件同样是每个组占用一行,并使用冒号分割为4个字段。分别为组名,加密密码,管理员,成员。
· 组名:必须是系统中已经存在的有效组;
· 加密密码:经过crypt加密后的密码;
· 管理员:必须是一个逗号分隔的用户名列表。管理员可以更改组密码和成员。管理员也有成员一样的权限
· 成员:必须是一个逗号分隔的用户名列表。成员可以免密码访问组。
查看系统被暴力破解的信息
每个用户的登录信息都会被记录,无论是成功还是失败,可以通过命令last命令查看登录历史,lastb命令查看登录失败的记录。它们最终是通过读取/var/log/wtmp和/var/log/btmp文件获得的,这两个文件都是二进制文件,里面存储的是utmp(在Linux C头文件
下图是部分通过lastb命令查到的尝试登录服务器的部分失败记录,其中发现一台IP为39.105.202.21的主机在3月7日12点到14点之间多次次尝试登录主机,通过命令sudo lastb | grep "39.105.202.21" | wc -l可以查看其一共进行了2213次尝试,可以推测其在尝试暴力破解登录密码。
也可以同last命令查看这个IP是否成功登录,如果有则说明用户密码一定被成功破解了,如果没有不排除文件被篡改过。
Linux密码防护
在登录输入密码时比较容易出现密码泄露,传统的加密方法,通过彩虹表可以很容易猜解密码,即使是SHA256/SHA512也可以在互联网上搜索到在线解密网站进行解密,这类加密方式只要密码一样加密结果必然雷同,所以密码被计算一次,想要破解的时候再查表就可以了。如今,MD5/SHA1哈希算法已经被攻破,即使在加密密码前加上盐以后也不再保险。
而在Linux中使用crypt算法对密码进行加密,这种加密方式即使每次都使用相同的密码,最后加密的结果都是不同的。salt是[a-zA-Z0-9./]中随机挑选的最多16位字符串,总共4096种的干扰方式,这就使得通过字典破解密码变得比较困难,每次破解一个密码都需要重新计算一遍。
Linux中的密码按固定的格式保存:
id是一个数字,表示以何种方式对密码和salt生成随机数
salt是由大小写字母、数字、英文句号(.)和“/”组成的不超过16字节的随机字符串。
encrypted:是由明文密码和随机salt通过组合,再通过散列函数后生成的密文,不同散列算法的密文长度如下: