如何限制对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中sh文件执行的具体步骤和命令是什么?

    .sh文件是Linux系统中常用的Shell脚本文件,它包含一系列可执行的Linux命令,通过将这些命令写入脚本文件,可以实现自动化任务、批量处理操作或复杂逻辑的执行,要正确执行.sh文件,需要理解其执行原理、权限设置、执行方式及常见问题解决方法,以下是详细说明,.sh文件执行的基本原理.sh文件本质上是文本文……

    2025年8月24日
    15000
  • Linux下如何退出CPAN Shell?

    正常退出CPAN Shell的3种方法使用退出命令在CPAN Shell提示符 cpan> 后直接输入:exit或quit系统会立即结束会话,返回终端命令行,快捷键退出按下组合键:Ctrl + D # (EOF信号,表示输入结束)效果等同于输入 exit,安全退出当前会话,强制终止(不推荐)如果CPAN……

    2025年6月17日
    15300
  • 为何需要锁来守护安全?

    在多用户或多线程环境中,锁用于协调对共享资源(如数据、文件)的并发访问,防止冲突操作导致数据不一致、错误或资源损坏,确保系统正确性和数据完整性。

    2025年6月22日
    17500
  • Linux脚本中如何实现延时操作的具体方法?

    在Linux脚本开发中,延时操作是常见需求,无论是等待进程完成、控制脚本执行节奏,还是实现定时任务,都需要灵活运用延时技术,Linux脚本中实现延时的方法多样,从基础的命令行工具到高级的脚本逻辑,每种方法都有其适用场景和特点,本文将详细介绍几种主流的延时实现方式,包括语法、示例、优缺点及适用场景,帮助开发者根据……

    2025年9月18日
    11900
  • Linux连接跟踪如何开启?

    Linux 连接跟踪(Connection Tracking,简称 conntrack)是 Linux 内核网络子系统的重要组成部分,主要用于跟踪和管理网络连接的状态信息,是实现网络地址转换(NAT)、状态防火墙、负载均衡等功能的基础,当系统需要处理复杂的网络规则(如允许已建立的连接通过、阻止非法入侵等)时,开……

    2025年8月31日
    16400

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信