在Linux系统中,限制对系统服务的访问是保障系统安全的关键环节,通过合理配置可有效未授权访问、数据泄露及服务滥用,以下从防火墙配置、TCP Wrappers、服务自身访问控制、 Mandatory Access Control (MAC) 机制及系统级权限限制等多个维度,详细说明具体实现方法。
防火墙配置:网络层访问控制
防火墙是限制服务访问的第一道防线,通过过滤网络数据包,仅允许授权IP或端口通信,Linux常用防火墙工具包括iptables、firewalld及nftables,需根据发行版选择合适工具。
iptables:传统Linux防火墙
iptables基于Netfilter框架,通过规则链(INPUT、OUTPUT、FORWARD)控制数据流向,限制服务访问的核心是配置INPUT链规则,例如仅允许特定IP访问SSH服务(默认22端口):
# 默认拒绝所有 incoming 连接 iptables -P INPUT DROP # 允许本地回环地址 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接及相关连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 仅允许192.168.1.0/24网段访问SSH端口22 iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT # 保存规则(CentOS/RHEL:service iptables save;Ubuntu:iptables-save > /etc/iptables/rules.v4)
firewalld:动态管理防火墙(CentOS 7+/RHEL 7+)
firewalld支持区域(Zone)和服务(Service)的动态管理,适合需要频繁调整规则的场景,将SSH服务限制仅在内网区域(internal)可用:
# 查看当前默认区域 firewall-cmd --get-default-zone # 设置默认区域为internal(仅允许内网访问) firewall-cmd --set-default-zone=internal # 添加SSH服务到internal区域(若服务未预定义,需先添加端口:--add-port=22/tcp) firewall-cmd --zone=internal --add-service=ssh --permanent # 重新加载防火墙使配置生效 firewall-cmd --reload
nftables:新一代防火墙(Ubuntu 20.04+/CentOS 8+)
nftables整合了iptables、ip6tables等功能,语法更简洁,例如限制仅允许IP 10.0.0.100访问Web服务(80/443端口):
nft add table inet filter nft add chain inet filter input { type filter hook input priority 0 ; } nft add rule inet filter input tcp dport 80 ip saddr 10.0.0.100 accept nft add rule inet filter input tcp dport 443 ip saddr 10.0.0.100 accept nft add rule inet filter input drop
表1:常用防火墙工具对比
| 工具 | 支持发行版 | 特点 | 适用场景 |
|————|————————–|————————————|——————————|
| iptables | 所有主流Linux发行版 | 规则灵活,性能稳定 | 传统服务器,复杂规则需求 |
| firewalld | CentOS 7+/RHEL 7+/Fedora | 动态更新,支持区域和服务 | 桌面环境,需要频繁调整规则 |
| nftables | Ubuntu 20.04+/CentOS 8+ | 语法统一,支持IPv4/IPv6 | 新部署系统,未来替代iptables |
TCP Wrappers:基于主机的访问控制
TCP Wrappers是一个通过/etc/hosts.allow
和/etc/hosts.deny
文件控制服务主机访问的工具,适用于支持libwrap库的服务(如SSH、vsftpd、telnet等),其核心原则是“先检查hosts.deny
,再检查hosts.allow
,匹配即停止”。
配置示例
- 编辑
/etc/hosts.deny
,默认拒绝所有服务访问:# 格式:服务名:客户端地址 ALL: ALL
- 编辑
/etc/hosts.allow
,允许特定IP或网段访问SSH服务:# 允许192.168.1.0/24网段访问SSH sshd: 192.168.1.0/24 # 允许单个IP10.0.0.50访问vsftpd vsftpd: 10.0.0.50
通配符与模式匹配
ALL
:所有主机或服务LOCAL
:本地主机(不含域名).example.com
:以.example.com结尾的所有域名168.1.
:192.168.1.0/24网段EXCEPT
:排除特定IP,如sshd: 192.168.1.0/24 EXCEPT 192.168.1.100
服务自身访问控制:应用层精细化限制
除网络层控制外,多数服务(如SSH、Web服务器、数据库)支持通过配置文件限制访问,可实现用户、IP、协议等维度的精细化管控。
SSH服务限制
编辑/etc/ssh/sshd_config
,关键配置项包括:
# 禁用root远程登录(降低权限风险) PermitRootLogin no # 仅允许用户user1和user2登录 AllowUsers user1 user2 # 限制监听IP(默认0.0.0.0监听所有,改为192.168.1.1仅监听内网) ListenAddress 192.168.1.1 # 修改默认端口(增加扫描难度) Port 2222
修改后需重启SSH服务:systemctl restart sshd
。
Nginx Web服务限制
通过allow/deny
指令限制IP访问特定目录:
server { listen 80; server_name example.com; # 限制仅允许内网IP访问/admin路径 location /admin { allow 192.168.1.0/24; deny all; auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.htpasswd; } }
MySQL数据库限制
编辑/etc/my.cnf
(或/etc/mysql/mysql.conf.d/mysqld.cnf
),在[mysqld]
段落中添加:
# 仅允许本地连接(禁用远程root登录) bind-address = 127.0.0.1 # 创建特定用户并限制访问主机 CREATE USER 'readonly'@'192.168.1.100' IDENTIFIED BY 'Password123!'; GRANT SELECT ON database.* TO 'readonly'@'192.168.1.100';
Mandatory Access Control (MAC):强制访问控制
SELinux(Security-Enhanced Linux)和AppArmor是Linux主流的MAC机制,通过策略强制控制进程对文件、网络资源的访问,即使进程被攻破也能限制其危害范围。
SELinux配置
- 查看状态:
getenforce
(Enforcing/Permissive/Disabled) - 临时切换为 enforcing 模式:
setenforce 1
- 永久配置(需重启):编辑
/etc/selinux/config
,设置SELINUX=enforcing
示例:限制Apache仅允许访问/var/www/html
目录
# 查看当前文件上下文 ls -Z /var/www/html # 修改目录上下文为httpd_sys_content_t semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" restorecon -Rv /var/www/html # 启用布尔值允许Apache网络连接 setsebool -P httpd_can_network_connect on
AppArmor配置
(以Ubuntu为例)
- 查看状态:
aa-status
- 限制SSH服务仅访问必要文件:
# 生成SSH配置模板 aa-genprofile /usr/sbin/sshd > /etc/apparmor.d/local/usr.sshd # 编辑配置文件,添加路径规则 # /etc/apparmor.d/local/usr.sshd /usr/sbin/sshd mr, /etc/ssh/** r, /var/log/auth.log rw, # 加载并启用策略 apparmor_parser -r /etc/apparmor.d/usr.sshd systemctl restart apparmor
系统级权限限制:最小权限原则
- chroot隔离:将服务运行于独立的根目录,限制其访问真实系统文件,通过
debootstrap
构建chroot环境,将Web服务隔离其中。 - namespace隔离:利用Linux namespace(PID、Network、Mount等)实现容器级隔离,如Docker通过namespace限制容器内进程的视野。
- sudo权限控制:避免直接使用root用户,通过
/etc/sudoers
为普通用户分配最小必要权限,# 允许user1重启nginx服务,无需密码 user1 ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx
注意事项
- 备份配置:修改防火墙、SELinux、服务配置前,务必备份原文件(如
cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.bak
)。 - 测试验证:限制规则后,从授权和未授权IP分别测试服务访问,避免误封合法用户。
- 日志监控:定期检查
/var/log/secure
(SSH)、/var/log/nginx/access.log
(Web)、/var/log/audit/audit.log
(SELinux)等日志,及时发现异常访问。 - 最小权限:遵循“最小权限原则”,仅开放必要端口和服务,禁用不必要的服务(如
systemctl disable telnet
)。
相关问答FAQs
Q1: 如何检查当前系统开放的服务端口及对应的访问IP限制?
A1: 可通过以下命令组合检查:
- 查看所有监听端口:
ss -tulnp
或netstat -tulnp
- 查看防火墙规则(iptables):
iptables -L -n -v
- 检查TCP Wrappers控制的服务:
ls /etc/xinetd.d/
(xinetd管理的服务)或ldd $(which sshd) | grep libwrap
(检查是否支持TCP Wrappers) - 查看SELinux上下文:
ls -Z /path/to/service
Q2: 修改防火墙规则后,如何确保配置在系统重启后仍然生效?
A2: 不同防火墙工具的持久化方式不同:
- iptables:CentOS/RHEL下使用
service iptables save
保存规则至/etc/iptables/rules.v4
;Ubuntu下需手动执行iptables-save > /etc/iptables/rules.v4
,并配置netfilter-persistent
服务开机启动。 - firewalld:使用
--permanent
参数添加规则(如firewall-cmd --permanent --add-service=ssh
),然后执行firewall-cmd --reload
,规则会自动保存至/etc/firewalld/
目录下的xml文件。 - nftables:执行
nft list ruleset > /etc/nftables.conf
,并确保nftables
服务已启用(systemctl enable nftables
)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/19157.html