Linux安全加固
用户及权限安全排查
Linux系统是多用户操作系统;
并不能识别用户输入的用户名称,而是识别用户名称对应的ID号;
每个用户的ID号分为两种,分别是用户ID(UID),组ID(GID);
所有用户的名称与ID的对应关系都存储在/etc/passwd文件中;
UID由一个32位的无符号型整数表示,用于唯一标识系统中的用户;
root的UID为0;
GID也是一个32位的无符号整数表示,用于定义该用户所在的组;
| 用户名称 | 用户密码 | UID | GID | 信息描述 | 用户主目录 | 默认shell |
|---|---|---|---|---|---|---|
| root: | x: | 0: | 0: | root: | /root: | /bin/bash |
真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。
查询当前Linux系统新增的用户名
可以通过查询passwd文件中新增的用户名,
也可以通过awk指令查询UID=0和UID>=500的用户名,执行下面的命令
awk -F : '($3>=500||$3==0){print $1}' /etc/passwd
查询系统中是否存在特权用户
UID为0的用户拥有系统的最高权限,使用下面的命令:
awk -F : '($3==0){print $1}' /etc/passwd
查询密码为空的用户
在passwd中,用户密码是被保护的的状态,都是使用x来隐藏的,真正的密码内容保存在/etc/shadow文件中,而shadow只有root才能查看。
如果该文件中密码对应字段长度为0,则表明该用户密码为空。
可通过执行下面的命令来查看空口令用户。
awk -F : '($2==""){print $1}' /etc/shadow
检测系统中是否存在弱口令的用户
禁用不安全的用户账号
passwd -l username //禁用lock
passwd -u username //解禁unlock
删除不安全的用户账号
userdel username //删除账号
useradd username //添加账号
更改用户登录口令
当发现空口令或弱口令等安全问题时,也可以通过更改用户的登录口令
passwd username
远程连接安全配置
传统的远程传输协议(如FTP、Telnet)本质上都是不安全的,传输内容是明文,容易遭受“中间人”攻击,因此,在管理远程服务器时,最常使用的是SSH远程连接协议。
SSH传输的数据是加密的,但SSH的不安全配置也会造成一系列的安全问题,如弱口令枚举、特权用户登录等。
cat /etc/ssh/sshd_config | grep -i port
编辑文件修改端口号,例如改成20022
访问
ssh username@ip_address -p 20022
防止端口探测工具进行服务版本识别
例如对于nmap扫描,nmap -sS -Pn -A -p20022 ipaddress,通常可以得到对应的服务器指纹信息
可以通过修改sshd_config配置文件,隐藏SSH携带系统的版本信息
利用sed -i可以清除SSH指纹携带的版本信息
例如sed -i 's/OpenSSH_9.6p1/welcome_0.0p0/g' /usr/sbin/sshd
默认配置下扫描的结果
可以通过修改sshd_config配置文件,隐藏SSH携带系统的版本信息
增加DebianBanner no后的扫描结果
清除版本信息
sed -i 's/OpenSSH_9.6p1/welcome_0.0p0/g' /usr/sbin/sshd
禁止特权用户登录
通过修改SSH服务的sshd_config配置文件中的PermitRootLogin为no,重启SSH服务,可以禁止特权用户远程登录。
对远程登录来源进行限制
未限制有可能造成SSH弱口令枚举攻击等
可以通过修改/etc/hosts.allow和hosts.deny文件来控制
在/etc/hosts.deny文件中添加sshd:ALL,可阻止所有远程主机访问
在/etc/hosts.allow文件中添加sshd:192.168.1.1,只允许该IP地址远程连接
防止SSH服务弱口令攻击
可以通过修改/etc/pam.d/目录下的login和sshd文件,增加SSH服务非法登录次数限制
例如:当用户错误输入口令3次以上时,会暂时锁住当前用户30秒。
在login文件(文件前面)中添加内容:
auth required pam_tally2.so onerr=fail deny=3 unlock_time=30 even_deny_root root_unlock_time=30
在sshd文件中添加:
auth required pam_tally2.so onerr=fail deny=3 unlock_time=30 even_deny_root root_unlock_time=30
account required pam_tally2.so
参数说明:
even_deny_root:限制root用户
deny:设置普通用户和root连续错误登录的最大次数。
unlock_time:设定普通用户锁定后,多长时间后解锁,单位为s。
root_unlock_time:设定root用户锁定的解锁时间。
SUID/SGID文件权限排查
什么是SGID
SGID (Set Group ID) 是一种权限位,用于指定在执行一个可执行文件时,该文件将以文件所属组的权限来运行。与SUID类似,当一个可执行文件具有SGID权限时,执行该文件的用户将暂时获得文件所属组的权限。
SGID的工作原理如下:当一个可执行文件具有SGID权限时,当它被执行时,有效的组ID(EGID)将被设置为该文件的所属组的组ID,而不是执行该文件的用户的当前组ID。这样,执行者就能够以文件所属组的权限来执行操作。
SGID通常用于需要在特定组权限下执行操作的情况,例如共享目录或文件,其中多个用户需要共享访问权限。通过将SGID权限设置在目录上,可以确保在该目录中创建的文件都属于同一组,从而实现组内成员共享访问权限。
同样,与SUID一样,SGID权限也应谨慎使用,并确保只授予必要的文件和目录,以防止可能的安全风险。
查询具备SUID/SGID权限的文件
find / -perm -u=s -type f
find / -perm -g=s -type f
修改SUID/SGID可执行文件权限
chmod u-s /usr/bin/passwd
chmod g-s /usr/bin/wall
Linux系统不安全服务排查
系统服务是在后台运行的应用程序,可用来提供本地系统或网络功能,把这些应用程序称作服务,例如Apache是用来实现Web的服务。
Linux的后台中,通常会运行很多类型的服务,不当的安全配置很容易引起安全威胁。
需要针对常见的服务端口号进行安全服务排查,提供修复和加固的方法。
常见服务端口及潜在的安全问题
| 端口号 | 说明 | 安全问题 |
|---|---|---|
| 21/22/69 | FTP/TFTP | |
| 2049 | NFS | |
| 139 | Samba | |
| 389 | LDAP | |
| 22 | SSH | |
| 23 | Telnet | |
| 3389 | RDP | |
| 5900 | VNC | |
| 5632 | PyAnywhere | |
| 80/443/8080 | Default Web server | |
| 7001/7002 | WebLogic console | |
| 8000/8089 | Jboss/Resin/Jetty/JenKins | |
| 9090 | WebSphere console | |
| 4848 | GlassFish console | |
| 1352 | Lotus domino mail service | |
| 10000 | Webmin-Web Dashboard | |
| 3306 | MySQL | |
| 1433 | MSSQL | |
| 1521 | Oracle | |
| 5432 | PostgreSQL | |
| 27017/27018 | MongoDB | |
| 6379 | Redis | |
| 5000 | SysBase/DB2 | |
| 25 | SMTP mail service | |
| 110 | POP3 | |
| 143 | IMAP | |
| 53 | DNS | |
| 67/68 | DHCP | |
| 161 | SNMP | |
| 2181 | Zookeeper | |
| 8069 | Zabbix | |
| 9200/9300 | Elasticsearch | |
| 11211 | Memcache | |
| 512/513/514 | Linux Rexec | |
| 873 | Rsync | |
| 3690 | Svn | |
| 50000 | SAP Management Console |
systemctl list-units --type=service
针对不安全的服务,在不适用的情况下,关闭
例如
systemctl stop mysql
service mysql stop
敏感数据排查与防护
搜索系统中任何用户都有写权限的文件夹
find / xdev -mount -type d \( -perm -0002 -a ! -perm -1000 \)
搜索任何用户都有写权限的文件
for PART in `grep -v ^# /etc/fstab | awk '($6 !="0"){print $2}'`; do
find $PART -xdev -type f \( -perm -0002 -a ! -perm -1000 \) -print
done
搜索系统隐藏文件
find / -name ".*" -print -xdev
查询bash命令历史记录
history
history -c #清除历史命令
可通过修改系统的$HISTSIZE临时修改系统允许记录的历史命令行数,但系统重启后恢复默认
通过修改/etc/profile文件中的HISTSIZE则可以永久生效。
Comments
Leave a comment