在CentOS系统中,进行上述安全实践时,可能会涉及到多个配置文件和目录。以下是一些具体的文件和目录,以及如何在CentOS中操作它们:
1. 限制连续密码错误的登录次数
相关文件:/etc/pam.d/system-auth
和 /etc/pam.d/password-auth
操作:编辑这些文件,添加或修改pam_pwquality
和pam_faildelay
模块的参数,以限制连续密码错误次数。
/etc/pam.d/
目录下的文件用于配置Pluggable Authentication Modules (PAM)。为了限制连续密码错误的登录次数,你通常需要修改 /etc/pam.d/system-auth
和 /etc/pam.d/password-auth
这两个文件(或者修改 /etc/pam.d/common-auth
,这取决于你的发行版如何组织PAM配置)。
在这些文件中,你需要查找 pam_faildelay.so
和 pam_tally2.so
模块的相关行。pam_faildelay.so
模块用于在连续失败登录尝试之间添加延迟,而 pam_tally2.so
模块用于跟踪并记录失败的登录尝试次数。
下面是一个基本的配置示例,展示了如何限制连续密码错误的登录次数:
auth required pam_tally2.so deny=5 unlock_time=600 even_deny_root root_unlock_time=600 auth required pam_unix.so nullok try_first_pass auth [default=die] pam_deny.so # 可选:添加失败登录尝试之间的延迟 auth optional pam_faildelay.so delay=300000
在这个例子中:
pam_tally2.so deny=5
表示在连续5次密码错误后,账户将被锁定。unlock_time=600
表示账户在10分钟后(600秒)自动解锁。even_deny_root
表示这个限制也适用于root用户。root_unlock_time=600
表示root用户在密码错误锁定后也将在10分钟后自动解锁。pam_faildelay.so delay=300000
是可选的,它会在每次失败的登录尝试后添加5分钟(300000毫秒)的延迟。
请注意,根据你的Linux发行版和PAM配置的具体细节,可能需要不同的配置或不同的模块。在修改这些文件之前,请务必备份原始文件,以便在出现问题时可以恢复。
修改完这些文件后,你需要确保PAM服务重新加载配置。这通常可以通过重新登录或重启服务来完成,但具体取决于你的系统和配置。在某些系统上,你可能需要运行 pam-auth-update
命令来更新PAM配置。
最后,请确保你的系统上安装了相应的PAM模块。如果没有安装,你需要使用包管理器(如apt、yum或dnf)来安装它们。
2. 拆分系统管理员的权限,取消超级管理员
相关文件:/etc/sudoers
操作:使用visudo
命令编辑/etc/sudoers
文件,为特定用户或用户组分配特定的命令或操作权限,而不是给予root权限。
使用visudo
命令来编辑/etc/sudoers
文件是非常推荐的做法,因为visudo
会检查语法错误,从而避免因为配置错误导致的问题。以下是使用visudo
进行权限拆分的一般步骤:
1.使用visud
o
命令编辑/etc/sudoers
文件:
sudo visudo # 这将打开一个文本编辑器(通常是你默认使用的编辑器,如vi、nano等)来编辑/etc/sudoers文件。
2.查找并注释掉root用户的无限制sudo权限(如果存在的话)。通常你会看到类似于以下行的内容:
root ALL=(ALL:ALL) ALL
#你可以通过在这行前面加上#来注释掉它,使其不生效: # root ALL=(ALL:ALL) ALL #这样做之后,root用户将不再拥有无限制的sudo权限。
4.为特定用户或用户组分配权限。在文件的末尾或适当的位置,你可以添加新的行来定义权限。例如:
# 为特定用户分配特定命令的权限: username ALL=(ALL) /path/to/command # 这将允许username用户在任何主机上以任何用户身份执行/path/to/command命令。
# 为用户组分配权限: %groupname ALL=(ALL) /path/to/command #这将允许groupname用户组中的所有用户执行/path/to/command命令。
# 为用户分配多个命令的权限: username ALL=(ALL) /path/to/command1, /path/to/command2 # 使用逗号分隔可以列出多个命令。
# 允许用户以特定用户身份执行命令: username ALL=(specificuser) /path/to/command # 这将限制username用户只能以specificuser用户的身份执行命令。
5.保存文件
6.测试配置是否生效
3. 删除不需要的各种账户
相关命令:userdel
操作:使用userdel
命令删除不再需要的用户账户。
1.使用具有root权限的用户(或使用sudo
)执行userdel
命令,并带上-r
选项和要删除的用户名。例如,要删除名为exampleuser
的用户,可以执行:
sudo userdel -r exampleuser
2.这将删除exampleuser
用户账号、家目录(通常位于/home/exampleuser
)以及邮件池(如果存在的话,通常位于/var/mail/exampleuser
)。
请注意,userdel
命令不允许删除正在线上的用户账号。如果需要删除正在登录的用户,首先需要终止该用户在系统上执行的所有程序。
另外,虽然-r
选项会删除用户的家目录和邮件池,但并不会断开用户已有的SSH链接。即使用户账号已经被删除,如果该用户之前已经登录并建立了SSH连接,那么这个连接仍然是活跃的。然而,一旦用户登出,他们将无法再使用该账号登录,因为账号已经被删除了。
4. 关闭不需要的服务端口
相关工具:firewalld
;iptables;systemctl;kill
使用firewalld
firewalld
是一个动态防火墙守护程序,用于管理网络流量。
# 查看当前开放的端口: sudo firewall-cmd --list-ports # 临时关闭端口(直到下次重启): # 关闭TCP端口: sudo firewall-cmd --zone=public --remove-port=<port_number>/tcp --permanent # 关闭UDP端口: sudo firewall-cmd --zone=public --remove-port=<port_number>/udp --permanent #将<port_number>替换为要关闭的端口号。--permanent选项确保规则在重启后依然生效。 # 重新加载防火墙配置: sudo firewall-cmd --reload # 这个命令将应用所有更改,包括你刚刚添加的端口关闭规则。
使用iptables
iptables
是一个用于配置Linux内核防火墙的工具。
# 查看当前规则: sudo iptables -L # 添加规则来关闭端口: # 关闭TCP端口: sudo iptables -A INPUT -p tcp --dport <port_number> -j DROP # 关闭UDP端口: sudo iptables -A INPUT -p udp --dport <port_number> -j DROP # 将<port_number>替换为要关闭的端口号。 # 保存iptables规则: # 如果你使用的是基于Debian的系统(如Ubuntu),可以使用iptables-persistent包来保存规则: sudo apt-get install iptables-persistent sudo netfilter-persistent save # 对于基于Red Hat的系统(如CentOS),规则通常保存在/etc/sysconfig/iptables文件中,你可以直接编辑这个文件或使用service iptables save命令来保存规则。 # 重新加载或重启iptables服务: # 这取决于你的Linux发行版和服务管理方式,但通常可以通过以下命令之一完成: sudo service iptables restart # 或 sudo systemctl restart iptables
使用systemctl关闭服务
如果你知道某个服务正在监听某个端口,并且你想要关闭这个服务,可以使用systemctl
:
sudo systemctl stop <service_name> sudo systemctl disable <service_name> # 将<service_name>替换为服务的名称。stop命令会停止服务,disable命令会确保服务在系统启动时不会被自动启动。
使用kill命令
如果你知道某个进程正在监听某个端口,并且想要直接杀死这个进程,可以使用kill
命令结合lsof
或netstat
来找到进程的PID:
lsof -i :<port_number> # 或者 netstat -tuln | grep <port_number> # 这将显示监听该端口的进程的PID。然后,你可以使用kill命令来结束该进程: sudo kill -9 <PID> # 将<PID>替换为你要杀死的进程的PID。
注意:在关闭任何端口或服务之前,请确保你了解这些端口或服务的用途,并且确认关闭它们不会对你的系统或应用程序产生负面影响。同时,请务必备份相关配置,以防需要恢复这些更改。
5. 限制远程登录者的权限
相关文件:/etc/ssh/sshd_config
操作:编辑/etc/ssh/sshd_config
文件,限制可登录的用户、使用密钥认证、禁用root登录等。修改后,需要重启SSH服务使配置生效。
其他相关文件和目录
- 主机名文件:
/etc/sysconfig/network
- 网络IP配置文件:
/etc/sysconfig/network-scripts/ifcfg-eth0
(注意,eth0
可能是不同的网络接口名称) - SELinux配置:
/etc/sysconfig/selinux
和/etc/selinux/config
限制可登录的用户
在/etc/ssh/sshd_config
中,可以使用AllowUsers
指令来限制只有特定的用户可以远程登录。例如,只允许user1
和user2
登录:
AllowUsers user1 user2
使用密钥认证
禁用密码认证,只使用公钥认证可以大大提高安全性。将以下行设置为no
来禁用密码认证:
PasswordAuthentication no
确保你已经为每个允许登录的用户设置了SSH密钥,并且这些密钥已经添加到~/.ssh/authorized_keys
文件中。
禁用root登录
将以下行设置为no
来禁止root用户直接通过SSH登录:
PermitRootLogin no
修改后重启SSH服务
修改完配置文件后,你需要重启SSH服务来使这些更改生效。使用以下命令(根据系统服务管理器而定):
# 对于使用systemd的系统(如最新的CentOS和Ubuntu): sudo systemctl restart sshd # 对于使用SysV init的系统: sudo service sshd restart
其他相关文件和目录
主机名文件:
/etc/sysconfig/network
这个文件通常包含系统主机名。你可以编辑这个文件来更改主机名。网络IP配置文件:
/etc/sysconfig/network-scripts/ifcfg-eth0
这个文件包含网络接口的配置信息,如IP地址、子网掩码等。请注意,eth0
可能是不同的网络接口名称,如ens33
、wlp3s0
等,这取决于你的系统配置。SELinux配置:
/etc/sysconfig/selinux
和/etc/selinux/config
SELinux(Security-Enhanced Linux)是一个Linux内核模块,提供访问控制安全策略。/etc/selinux/config
文件包含SELinux的默认状态(启用或禁用),而/etc/sysconfig/selinux
在某些发行版中可能包含运行时配置。
要修改SELinux配置,编辑/etc/selinux/config
文件,并将SELINUX
设置为你想要的值:
enforcing
:SELinux策略被启用并强制执行。permissive
:SELinux策略被启用但仅记录违规,不阻止。disabled
:SELinux被禁用。
修改后,需要重启系统来使SELinux配置更改生效。
6.限制攻击者ip访问
apache限制
httpd.conf文件下写入 <Directory /> Order deny,allow # 黑名单 Deny from all #白名单 只允许1.1.1.1ip的访问 Allow from 1.1.1.1 </Directory> 但是当需要阻止或允许的IP或者IP段数量变多时,就不能都写在httpd配置文件里了,可以通过创建.htaccess文件来控制访问权限。 第一修改httpd.conf文件中,加入AllowOverride选项: <Directory /> AllowOverride All </Directory> 第二在对应的目录下(此处为根目录/下)放置.htaccess文件,文件内容如下: Order allow,deny allow from 1.1.1.0/24 allow from 1.1.2.0/24 allow from 1.1.3.0/24 allow from 1.1.4.0/24 allow from 1.1.5.0/24 allow from 1.1.6.0/24 allow from 1.1.7.0/24 allow from 1.1.8.0/24 deny from all
nginx限制
直接在location中写deny和allow
location / { allow 192.168.1.0/24; deny 192.168.1.100; ... }
iptables限制
限制1.1.1.1的访问 iptables -I INPUT -s 1.1.1.1 -j DROP 限制1.1.1.0/24网段的访问 iptables -I INPUT -s 1.1.1.0/24 -j DROP 查看限制 iptables -L -n 取消限制,通过序号 iptables -D INPUT 1 映射8081为80 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081 端口映射 iptables -t nat -L -n 指定IP开放指定端口 针对IP1.1.1.1开放3306端口 iptables -I INPUT -s 1.1.1.1 -p tcp --dport 3306 -j ACCEPT
firewalld
限制
重新加载配置 firewall-cmd --reload 查看已经开放的端口 firewall-cmd --list-ports 关闭已开放的端口,以80端口为例 firewall-cmd --permanent --remove-port=80/tcp 批量开放70到100之间的所有端口 firewall-cmd --zone=public --add-port=70-100/tcp --permanent 批量关闭70到100之间的端口 firewall-cmd --permanent --remove-port=70-100/tcp --remove-port=80-90/tcp 批量限制ip,限制1.1.1.0/24的所有ip访问80端口 firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='1.1.1.0/24' port protocol='tcp' port='80' reject" 允许单个ip访问80端口 firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='1.1.1.1' port protocol='tcp' port='80' accept" 批量允许多ip访问80端口 firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='1.1.1.0/24' port protocol='tcp' port='80' accept" 查看rich-rule firewall-cmd --zone=public --list-rich-rules 单个IP firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='1.1.1.1' reject IP段 firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='1.1.1.0/24' reject 单个IP允许访问某个端口 firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=1.1.1.2 port port=80 protocol=tcp accept reject 拒绝 accept 允许
谨慎操作,以免对系统造成不必要的损害。在修改配置文件之前,最好备份原始文件。