如何限制对Linux系统服务的访问以确保系统安全?

在Linux系统中,限制对系统服务的访问是保障系统安全的关键环节,通过合理配置可有效未授权访问、数据泄露及服务滥用,以下从防火墙配置、TCP Wrappers、服务自身访问控制、 Mandatory Access Control (MAC) 机制及系统级权限限制等多个维度,详细说明具体实现方法。

如何限制对linux系统服务的访问

防火墙配置:网络层访问控制

防火墙是限制服务访问的第一道防线,通过过滤网络数据包,仅允许授权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,匹配即停止”。

如何限制对linux系统服务的访问

配置示例

  1. 编辑/etc/hosts.deny,默认拒绝所有服务访问:
    # 格式:服务名:客户端地址  
    ALL: ALL  
  2. 编辑/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机制,通过策略强制控制进程对文件、网络资源的访问,即使进程被攻破也能限制其危害范围。

如何限制对linux系统服务的访问

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  

注意事项

  1. 备份配置:修改防火墙、SELinux、服务配置前,务必备份原文件(如cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.bak)。
  2. 测试验证:限制规则后,从授权和未授权IP分别测试服务访问,避免误封合法用户。
  3. 日志监控:定期检查/var/log/secure(SSH)、/var/log/nginx/access.log(Web)、/var/log/audit/audit.log(SELinux)等日志,及时发现异常访问。
  4. 最小权限:遵循“最小权限原则”,仅开放必要端口和服务,禁用不必要的服务(如systemctl disable telnet)。

相关问答FAQs

Q1: 如何检查当前系统开放的服务端口及对应的访问IP限制?
A1: 可通过以下命令组合检查:

  • 查看所有监听端口:ss -tulnpnetstat -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

(0)
酷番叔酷番叔
上一篇 2025年8月28日 22:25
下一篇 2025年8月28日 22:52

相关推荐

  • Linux端口如何开启?

    开放端口前的准备确认需要开放的端口号HTTP服务:80/TCPHTTPS服务:443/TCPSSH服务:22/TCP自定义服务:如3000/TCP检查端口是否已被监听运行命令查看当前监听端口的服务:sudo ss -tuln | grep LISTEN# 或使用传统命令sudo netstat -tuln……

    2025年7月10日
    5300
  • Linux系统中,当使用man命令查看手册页时,如何正确退出查看界面?

    在Linux系统中,man命令是查看手册页(manual page)的核心工具,它为用户提供了命令、函数、配置文件等的详细说明,许多新手用户在使用man浏览长篇文档时,常会遇到如何退出的问题,本文将详细讲解Linux中退出man页面的多种方法,涵盖常规操作、异常场景处理及注意事项,帮助用户高效使用man命令,常……

    2025年10月6日
    1200
  • 如何检查80端口被占用?

    在Linux系统中,端口被占用可能导致服务启动失败或网络连接异常,以下是释放端口的专业方法,操作前请确保您有sudo权限:第一步:定位占用端口的进程方法1:使用 lsof 命令sudo lsof -i :端口号sudo lsof -i :80输出示例:COMMAND PID USER FD TYPE DEVIC……

    2025年7月24日
    3900
  • 占用TCP端口8080如何终止?

    端口占用的原理端口分类0-1023:系统特权端口(需root权限),如HTTP(80)、SSH(22),1024-49151:用户端口,供普通应用程序使用,49152-65535:动态/私有端口,占用本质进程通过调用bind()系统调用绑定IP和端口,再通过listen()进入监听状态,手动占用端口的步骤方法1……

    2025年6月22日
    4800
  • 如何快速安装编译工具链?

    在Linux环境下编写C语言程序是开发系统软件、嵌入式应用和高性能工具的基础,以下为详细操作指南,结合最佳实践和工具链使用,确保内容符合E-A-T原则(专业性、权威性、可信度),所有建议均基于Linux基金会文档及GNU官方手册,终端执行: sudo apt update && sudo apt……

    2025年8月8日
    3200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信