[TOC]

Linux系统加固

描述:Linux系统加固往往是下面几个方面入手,配置完成后将大大的提升机器的安全性,同时满足等保合规的要求;

口令增强
业务隔离
服务安全

0x01)用户及用户权限加固
如果不需要登录系统,shell应该/sbin/nologin

nano /etc/passwd  减少系统无用账号,降低风险
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

WeiyiGeek.

centOS禁止普通用户su到root,su的相关权限涉及到两个文件:

  • /etc/pam.d/su
  • /etc/login.defs
#禁止普通用户su到root,配置如下:
去除/etc/pam.d/su文件中如下行的注释,保存退出即可(即时生效):
auth required pam_wheel.so use_uid

#禁止普通用户su到root,但是希望指定的普通用户可以su到root
在/etc/login.defs文件中加入如下配置项,保持退出(即时生效):
SU_WHEEL_ONLY yes

#将需要su到root用户的用户名添加至wheel组中,我们以admin为例:
[[email protected] ~]# usermod -G wheel admin

WeiyiGeek.


0x02) 认证和密码策略调整

#添加口令策略
#使用命令“vi /etc/pam.d/system-auth”修改配置文件
auth required pam_tally.so onerr=fail deny=10 unlock_time=300 #设置连续输错10次密码,帐号锁定5分钟,
password requisite pam_cracklib.so difok=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=1 #至少8位,包含一位大写字母,一位小写字母和一位数字


#启用PAM-Authentication   /etc/pam.d/sshd 
#所有/etc/sshd_user_deny_list里面的用户被拒绝ssh登录
auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc/sshd_user_deny_list onerr=succeed


#使用命令“vi /etc/login.defs”修改配置文件
$ chage -m 0 -M 30 -E 2018-11-01 -W 7 <用户名>   #改变用户的到期时间
-------------------------------------------------------------------
PASS_MAX_DAYS   90        #新建用户的密码最长使用天数
PASS_MIN_DAYS   0          #新建用户的密码最短使用天数
PASS_WARN_AGE   7         #新建用户的密码到期提前提醒天数


0x03) 日志审计记录
描述:在反弹shell的时候使用了bash-i时,如果系统配置了/etc/bash.bashrc、~/.bashrc记录执行记录,应该可以记录到bash -i的执行记录(交互式会话会读取bashrc配置并执行)

防止/var/log中的日志被删除:

chattr -R +a /var/log
lsattr -a /var/log
-----a---------- /var/log

其他日志审计记录:

# Centos7
# vim
echo "$(date) - ${SSH_CONNECTION} - ${USER}" >> /tmp/login.txt

#测试bash -i反弹shell
ssh -T [email protected] /bin/bash -i
Fri Aug 2 16:54:48 CST 2019 - 10.20.172.109 55321 10.10.107.222 22 - root

history历史记录时间戳:

#Centos7 /etc/profile
#比如登陆过系统的用户、IP地址、操作命令以及操作时间--对应可以通过在/etc/profile里面加入以下代码实现
47:HISTTIMEFORMAT="%F %T who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g' whoami"
#400 2019-08-02 16:57:46 10.20.172.109 root # history

1. SSH服务加固

openssh 目前的默认配置文件相比以前虽然要安全的多,但还是有必要对生产系统中的 ssh 服务器进行基线检查。
等保视角下的SSH 加固之旅:

  • 1)身份鉴别:

    • 首推公钥认证方式,通过ansible批量更新或者通过堡垒机的定时任务实现对管理的服务器上的公钥进行批量更新
    • 严禁选择基于密码的、基于主机的认证方式,有条件的可以接入 Kerberos 认证;
    • 基于权限最小化原则,限制不同用户使用不同角色的账户
    • 选择安全的ssh-key生成算法生成的key
      ssh key 常见算法及安全性
      DSA 已被证明不安全,且从OpenSSH Server 7 之后便不再支持
      RSA RSA算法产生的私钥的安全性依赖于密钥的长度,如果密钥的长度小于3072,则不够安全,比如常见的2048 位的ssh key 是不够安全的,1024位直接被标记为不安全
      ECDSA:这个算法产生的密钥安全性依赖于当前机器产生的随机数的强度
      Ed25519: 目前最为推荐的ssh key 生成算法,安全性最好!
  • 2)访问控制

    • 网络层的访问控制:禁止端口转发
    • 限制指定的IP才能连接:除了在防火墙上做规则限制,还可以通过TCP Wrapper 和sshd_config的配置命令
  • 3)审计

    • 实现等保的审计要求:选择加入堡垒机或者将ssh 登录日志、bash 操作日志集中转发之SOC或者内部日志平台(比如通过syslog方式)
  • 4)入侵防范

curl -d “apikey=1accfbb40c634f13b48806004786f0dea0bcc0cb79054c4f8ef82c62c78908d4&url=http://cqksy.cn" https://s.threatbook.cn/api/v2/url/scan

文件说明:/root/.ssh/known_hosts 保存相关服务器的签名

(1)SSH 配置文件:/etc/ssh/ssh_config

Port 2222
Protocol 2 #使用ssh 协议2
PermitRootLogin no #禁止Root登录
PermitEmptyPasswords no #禁止空密码登录

StrictModes yes # 当使用者的 host key 改变之后,Server 就不接受联机,可以抵挡部分的木马程序!
MaxAuthTries 5 #认证尝试次数
MaxSessions 6 #最大会话数
IgnoreRhosts yes #关闭禁用用户的 .rhosts 文件 ~/.ssh/.rhosts 来做为认证
LoginGraceTime 120 #无动作断线时间(seconds)
HashKnownHosts yes #把主机名hash记录


#配置 Idle Log Out Timeout 间隔
ClientAliveInterval 300
ClientAliveCountMax 0

#禁止或者允许某个用户通过ssh登录
AllowUsers 用户名
AllowGroups 组名
DenyUsers 用户名
DenyGroups 组名

#关闭密码认证,启用公钥认证:
PubkeyAuthentication yes
PasswordAuthentication no #不建议使用密码认证 建议设置为no
HostbasedAuthentication no #不建议使用机认证 建议设置为no

#禁止端口转发
AllowAgentForwarding no
AllowTcpForwarding no #通过禁止TCP端口转发,可以禁止SSH 远程端口和本地端口转发功能,也可以禁止SSH 远程隧道的建立
X11Forwarding no #如果没用 X11 转发的情况


(2) 限制IP登录SSH

#只允许某个IP登录,拒绝其他所有IP:
在 /etc/hosts.allow 写 : sshd: 1.2.3.4
在 /etc/hosts.deny 写 : sshd: ALL


#防火墙配置
iptables -A INPUT -s 1.2.3.4 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 堡垒机IP -p tcp --dport 22 -j ACCEPT #限制只允许堡垒机的IP连接
iptables -A INPUT -p tcp --dport 22 -j DROP


#其他加固脚本描述:防止ssh被恶意ip爆破,进行设置Hosts.deny加入恶意的IP地址进行阻断。
#==========开始复制==========
ldd `which sshd` | grep libwrap # 确认sshd是否支持TCP Wrapper,输出类似:libwrap.so.0 => /lib/libwrap.so.0 (0x00bd1000)
cd /usr/local/bin/
wget antivirus.neu.edu.cn/ssh/soft/fetch_neusshbl.sh
chmod +x fetch_neusshbl.sh
cd /etc/cron.hourly/
ln -s /usr/local/bin/fetch_neusshbl.sh .
./fetch_neusshbl.sh
#=========结束复制==========


(3)限制指定账户不能SSH只能SFTP在指定目录
比如以限制sftpgroup 组的用户都只能在自己的家目录sftp 上传下载,不能ssh连接获取shell为例

#1.新建一个sftpgroup,以组为单位进行限制
groupadd sftpgroup

#2.新建一个账户sftpuser,加入sftpgroup
useradd -d /home/sftpuser -s /usr/sbin/nologin -M -N -gsftpgroup sftpuser #使其无法获取交互式shell,不创建用户的主目录,不创建同名的组

#3.配置账号账户以公钥方式认证
mkdir -p /home/sftpuser/.ssh
cat xxx.pub >/home/sftpuser/.ssh/authorized_keys
chmod -R 700 /home/sftpuser/.ssh/
chown -R sftpuser:sftpgroup /home/sftpuser/.ssh

#4. 配置sshd_config
Subsystem sftp internal-sftp
Match group sftpgroup #Match指令主要用于条件匹配
ChrootDirectory %h #限制sftp的活动目录在其Home 目录
X11Forwarding no #禁止X11转发
AllowTcpForwarding no #禁止tcp转发
ForceCommand internal-sftp #如果去掉ssh连接时候提示/usr/bin/nologin no such file or directory

Subsystem sftp /usr/lib/openssh/sftp-server 更为 internal-sftp,这两者有什么区别呢?

  • 简单的说默认sftp进程由单独的二进制文件:/usr/lib/openssh/sftp-server启动(外部)
  • internal-sftp 则无需外部二进制文件额外启动一个进程整合在sshd进程内了(内部)
  • internal-sftp相较于 /usr/lib/openssh/sftp-server 优点在于:
    • 性能好无需额外进程了
    • 安全性好无需用户登录shell,且可使用ChrootDirectory 限制sftp行为活动的目录;
    • sftp-server 的存在主要是向后兼容。

ForceCommand internal-sftp 是什么意思?
答:防止用户执行他们自己自定义的命令限制用户命令执行上下文为sftp(可以理解为用户的’shell’就是sftp 那个上下文环境), 即:用户除了能执行sftp中允许的命令外,其他命令啥也执行不了

采用sftp软件登录:sftp -i 密匙path [email protected] 则进入交换式;