如何限制对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)
酷番叔酷番叔
上一篇 5小时前
下一篇 5小时前

相关推荐

  • Linux系统如何解压zip文件?

    在Linux系统中,解压zip文件是日常操作中常见的需求,无论是处理下载的软件包、接收的附件还是管理项目文件,都可能需要用到这一功能,Linux系统提供了多种解压zip文件的方式,包括命令行工具和图形界面工具,本文将详细介绍这些方法的使用步骤、注意事项及常见问题的解决方法,安装解压工具:unzipLinux系统……

    6天前
    800
  • 如何清理缓存并更新软件包解决卡顿?

    在Linux系统中安装yum(Yellowdog Updater Modified)主要适用于基于RPM的发行版(如CentOS、RHEL、Fedora),以下是详细步骤和注意事项,内容严格遵循技术准确性并参考官方文档:确认系统环境检查当前发行版运行命令:cat /etc/os-release仅CentOS/R……

    2025年7月10日
    3300
  • 软件源更新失败怎么办?

    在Linux系统中,即使没有预装编译器(如GCC),用户依然可以通过包管理器安装预编译的二进制软件包,无需手动编译,以下是详细解决方案:为什么无需编译器也能安装软件?Linux发行版通过包管理器(如apt、yum)提供预编译的二进制软件包,这些软件包已由官方或维护者编译完成,用户直接下载安装即可,无需本地编译……

    2025年8月5日
    900
  • win7如何删除linux双系统?详细操作步骤是什么?

    在Windows 7系统中卸载Linux双系统,核心步骤包括删除Linux分区、修复Windows引导记录,以及处理剩余磁盘空间,由于Linux通常与Windows共存在同一硬盘的不同分区,且引导管理器(如GRUB)可能会覆盖Windows的引导信息,操作时需谨慎,避免误删Windows分区导致系统无法启动,以……

    2小时前
    200
  • Linux系统下如何运行.sh文件?

    在Linux系统中,.sh文件是Shell脚本文件,它包含了一系列Shell命令,用于自动化执行任务,如文件操作、系统配置、程序启动等,运行.sh文件需要经过权限设置、执行方式选择等步骤,以下是详细操作流程和注意事项,运行.sh文件的前提:设置执行权限Linux系统基于权限管理,默认情况下,用户对普通文本文件只……

    3天前
    700

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信