服务器加固是通过各种方法增强服务器安全性的过程。我们有很多步骤来保护服务器。通过保护您的 linux 系统免受黑客、破解者和攻击者的侵害,让您和您的公司远离您!您可以通过以下步骤将易受攻击的盒子变成加固的服务器。它将帮助您防止外部攻击。这里我描述的是 centos 的服务器加固。
本指南将引导您完成安全强化 CentOS 7 所需的步骤。强化系统将使其更具限制性,您可能会遇到问题。我建议创建一个可用于故障排除的重复虚拟机。您将在下面找到一个基本步骤列表,您可以并且应该在配置后立即强化您的服务器。
有时我们通过远程方法访问我们的服务器,如果它不安全,我们可以公开我们的服务器。OpenSSH 选项是通过/etc/ssh/sshd_config文件控制的。
重要的是禁用密码远程登录方法并启用身份验证公钥
将
ChallengeResponseAuthentication和PasswordAuthentication更改为no 以停用密码方法
PasswordAuthentication no
ChallengeResponseAuthentication no
授权公钥认证
RSAAuthentication yes
PubkeyAuthentication yes
现在您可以生成新的密钥对
# ssh-keygen -t rsa
允许 root 直接登录服务器是一种风险安全措施。相反,您应该以您的帐户登录系统,然后执行su -以 root 身份登录。因此,您需要将PermitRootLogin yes更改为PermitRootLogin no
PermitRootLogin no
有时不建议使用默认端口,因为它是全世界都知道的并且存在安全风险。个性化要使用的端口很好
port 8500
通过保护引导加载程序,我们可以防止访问以 root 身份自动登录的单用户模式。这是通过GRUB 通过设置默认以纯文本形式存储的密码来完成的。
对于 Debian 系统
# grub-mkpasswd-pbkdf2
对于 Centos
# grub2-mkpasswd-pbkdf2
配置网络服务后,重要的是要注意哪些端口实际上正在侦听系统的网络接口。任何开放的端口都可能是入侵的证据。
# nmap -sT -O localhost
Starting Nmap 6.40 ( http://nmap.org ) at 2017-06-07 23:13 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000061s latency).
Other addresses for localhost (not scanned): 127.0.0.1
rDNS record for 127.0.0.1: centos-01
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
111/tcp open rpcbind
2049/tcp open nfs
要列出所有打开的端口和相关程序,请使用以下命令
#.NETstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN
缩小系统文件和文件夹的权限以限制风险。
# chmod 700 /root
# chmod 700 /var/log/audit
# chmod 740 /etc/rc.d/init.d/iptables
# chmod 740 /sbin/iptables
# chmod -R 700 /etc/skel
# chmod 600 /etc/rsyslog.conf
# chmod 640 /etc/security/access.conf
# chmod 600 /etc/sysctl.conf
任何密码为空的帐户都意味着它被打开以供网络上的任何人未经授权访问,并且它是 Linux 服务器中安全性的一部分。要检查密码为空的帐户,请使用以下命令
# cat /etc/shadow | awk -F: '($2==""){print $1}'
paul
为了安全起见,最好锁定所有空密码帐户:
# passwd -l paul
Locking password for user paul.
passwd: Success
Sysctl 是一个用于在 Linux 操作系统中检查和动态更改参数的接口。编辑/etc/sysctl.conf 文件以优化内核参数
sysctl 是用于在运行时修改内核参数的命令。
# sysctl -a
# sysctl -A
# sysctl net.ipv4.conf.all.rp_filter
To load settings, enter:
# sysctl -p
将以下内容复制粘贴到/etc/sysctl.conf
# Turn on execshield
kernel.exec-shield=1
kernel.randomize_va_space=1
# Enable IP spoofing protection
net.ipv4.conf.all.rp_filter=1
# Disable IP source routing
net.ipv4.conf.all.accept_source_route=0
# Ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_messages=1
# Make sure spoofed packets get logged
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# Disable ICMP routing redirects
sysctl -w net.ipv4.conf.all.accept_redirects=0
sysctl -w net.ipv6.conf.all.accept_redirects=0
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv6.conf.all.send_redirects=0
# Disables the magic-sysrq key
kernel.sysrq = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
# Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1
您需要从系统启动中删除所有不需要的服务和守护程序(在后台运行的服务),这些服务和守护程序在启动时以运行级别 3启动。
# chkconfig --list | grep '3:on'
要禁用服务,请输入:
# service serviceName stop
# chkconfig serviceName off
建议进入单用户模式时要求输入root密码。打开/etc/sysconfig/init 文件并添加以下行:
SINGLE=/sbin/sulogin
SELinux 是一组安全规则,用于确定哪个进程可以访问哪个文件、目录、端口等。每个文件、进程、目录和端口都有一个特殊的安全标签,称为 SELinux 上下文。上下文只是 SELinux 策略用来确定进程是否可以访问文件、目录或端口的名称。默认情况下,该策略不允许任何交互,因此显式规则授予访问权限。如果没有允许规则,则不允许访问。
getenforce 命令告诉我们 SELinux 处于什么模式。
我们可以通过更改来将 SELinux 模式更改为强制SELINUX=enforcing执行/etc/sysconfig/selinux
该文件中有三个指令,如下所述。
您可以使用以下命令检查 SELinux 的状态
# sestatus
SELinux status: disabled
您会看到它已被禁用。要启用它,您可以使用
# setenforce enforcing
iptables 是一个用户空间应用程序,允许系统管理员配置 Linux 内核防火墙提供的表及其存储的链和规则。
iptables -A INPUT -p tcp --dport PORT_NUMBER -j DROP
iptables -A INPUT -s IP_ADDRESS -j DROP
要阻止从特定 IP 地址到特定网络接口的连接,请使用命令
# iptables -A INPUT -i ens0 -s 6.6.6.6 -j DROP
可以通过命令查看所有 iptables 规则
iptables -L -n -v
当 SUID/SGID 可执行文件存在安全问题时,所有启用 SUID/SGID 位的文件都可用于恶意活动。所有本地或远程用户都可以使用此类文件。
find / ( -perm -4000 -o -perm -2000 ) -print
find / -path -prune -o -type f -perm +6000 -ls
find /dir -xdev -type d ( -perm -0002 -a ! -perm -1000 ) -print
find /dir -xdev ( -nouser -o -nogroup ) -print
Linux 内核及其相关文件在 /boot 目录下,默认为可读写。将其更改为只读可降低未经授权修改关键引导文件的风险。我们需要编辑/etc/fstab文件并在下面插入行<
LABEL=/boot /boot ext2 defaults,ro 1 2
TCP 包装器可以提供一种快速简便的方法来控制对链接到它们的应用程序的访问。因此建议屏蔽所有未使用的应用程序,然后只授权将要使用的应用程序。
例如,我们将阻止所有应用程序,但仅授权 ssh
echo "ALL:ALL" >> /etc/hosts.deny
echo "sshd:ALL" >> /etc/hosts.allow
Cron 用于在特定时间自动执行作业。可以指定谁可以或不可以运行作业。这是通过使用名为/etc/cron.allow和的文件来控制的/etc/cron.deny。要使用 cron 锁定用户,只需在 cron.deny 中添加用户名并允许用户在 cron.allow 文件中运行 cron 添加。
# echo ALL >>/etc/cron.deny
当程序或进程尝试将更多数据写入固定长度的内存块或缓冲区时,会发生缓冲区溢出,而不是分配给缓冲区的内容。再次保护您的服务器很重要
它有助于防止堆栈粉碎。通常,缓冲区溢出漏洞会覆盖返回地址,以便函数返回攻击者选择的地址。您需要在当前内核上启用
sysctl -w kernel.exec-shield=1
您还可以将下面的行添加到/etc/sysctl.conf
kernel.exec-shield = 1
地址空间布局随机化是一种防御功能,可以使缓冲区溢出更加困难。ASLR 使攻击者难以找到要跳转的地址。您需要通过为kernel.randomize_va_space设置运行时来启用随机虚拟内存区域放置
sysctl -q -n -w kernel.randomize_va_space=2
/etc/sysctl.conf如果它不存在,则添加下面的行
kernel.randomize_va_space = 2
这些是尝试运行自己的服务器的新用户的一些基本注意事项。请记住,饼干总是领先一步;他们一直在寻找任何漏洞来入侵您的服务器。重要的是要认识到,虽然迟到总比没有好,但您等待实施的时间越长,安全措施的有效性就会降低