学习目标

  • 理解本节涉及的核心主题:Linux 安全管理、用户认证与授权、配置 sudo 权限、配置用户组与访问控制。
  • 掌握重点命令或工具:sudoufwfirewalld
  • 能够结合示例完成常见操作,并理解关键参数、使用场景与结果差异。
  • 能够识别本节相关的常见风险、易错点或排查思路。

学习重点

  • 主题范围:Linux 安全管理、用户认证与授权、配置 sudo 权限、配置用户组与访问控制、系统安全基础、防火墙配置
  • 重点命令:sudoufwfirewalld
  • 学习重点:命令用途、关键参数、典型场景、与相近命令的区别
  • 复习方式:先理解场景,再动手练习,最后对照结果检查

Linux 安全管理

用户认证与授权

用户认证与授权是确保只有经过授权的用户才能访问系统资源的关键机制。合理配置用户权限和访问控制策略,可以有效防止未经授权的访问和潜在的安全威胁。

配置 sudo 权限

sudo(Super User Do)允许授权用户以超级用户或其他用户的身份执行命令,提升了系统管理的灵活性和安全性。

添加用户到 sudo

在多数Linux发行版中,sudo 权限通过将用户添加到特定的组(如 sudowheel)来管理。

步骤:

  1. 添加用户到 sudo

    sudo usermod -aG sudo username
    

    说明:

    • -aG:将用户追加到指定组,而不从其他组中移除。
    • sudo:目标组名称。
    • username:要添加到组的用户名。
  2. 验证用户是否已添加到 sudo

    groups username
    

    示例输出:

    username : username sudo
    
编辑 /etc/sudoers 文件(使用 visudo

直接编辑 /etc/sudoers 文件可以细化和定制 sudo 权限配置。为了避免语法错误,建议使用 visudo 工具进行编辑。

步骤:

  1. 打开 sudoers 文件

    sudo visudo
    
  2. 配置全局 sudo 权限
    在文件中添加以下行,允许 sudo 组的所有成员拥有 sudo 权限:

    %sudo   ALL=(ALL:ALL) ALL
    
  3. 配置特定用户或组的 sudo 权限
    为特定用户赋予 sudo 权限:

    username ALL=(ALL) ALL
    

    为特定组赋予 sudo 权限:

    %admin ALL=(ALL) ALL
    
  4. 配置 NOPASSWD 选项
    NOPASSWD 选项允许用户在使用 sudo 时不需要输入密码。谨慎使用此选项,以免降低系统安全性。
    示例:

    username ALL=(ALL) NOPASSWD:ALL
    

    或为整个组配置:

    %sudo ALL=(ALL) NOPASSWD:ALL
    

注意事项:

  • 始终使用 visudo 进行编辑,以确保文件语法正确。
  • 最小化授予 NOPASSWD 权限的用户数量,遵循最小权限原则。

配置用户组与访问控制

用户组与访问控制(Access Control)允许系统管理员对文件和目录的访问权限进行精细管理,确保只有特定用户或组能够访问敏感资源。

创建与管理用户组

创建新用户组

sudo groupadd groupname

示例:

sudo groupadd developers

将用户添加到用户组

sudo usermod -aG groupname username

示例:

sudo usermod -aG developers alice

验证用户所属组

groups username

示例输出:

alice : alice developers sudo
设置组权限

通过修改文件的所属组和设置组权限,可以控制特定组的访问权限。

使用 chgrp 修改文件所属组

sudo chgrp groupname /path/to/file

示例:

sudo chgrp developers /var/www/html/index.html

使用 chmod 设置组权限

  • r:读取权限
  • w:写入权限
  • x:执行权限

示例:

sudo chmod 750 /var/www/html/index.html

说明:

  • 7(所有者):读、写、执行
  • 5(组):读、执行
  • 0(其他):无权限

设置目录及其子目录的组权限

sudo chmod -R 750 /var/www/html/
使用 ACL(访问控制列表)

ACL 提供了比传统 Unix 权限更细粒度的权限控制,允许为单个用户或组设置特定的权限。

安装 ACL 工具(如 acl

在Debian/Ubuntu:

sudo apt install acl

在CentOS/RHEL:

sudo yum install acl
使用 setfacl 设置 ACL 规则

基本语法:

setfacl -m u:username:permissions /path/to/file
setfacl -m g:groupname:permissions /path/to/file

示例:

  • 为用户 bob 赋予读取和写入权限:
    sudo setfacl -m u:bob:rw /var/www/html/index.html
    
  • 为组 developers 赋予读取权限:
    sudo setfacl -m g:developers:r /var/www/html/index.html
    
使用 getfacl 查看 ACL 规则

基本用法:

getfacl /path/to/file

示例:

getfacl /var/www/html/index.html

示例输出:

user::rw-
user:bob:rw-
group::r--
mask::rw-
other::---

说明:

  • user:::文件所有者的权限
  • user:bob::特定用户 bob 的权限
  • group:::文件所属组的权限
  • mask:::最大权限
  • other:::其他用户的权限

系统安全基础

系统安全基础涉及防火墙配置和系统安全强化。通过配置防火墙,可以有效控制网络流量;通过安全强化措施,如SELinux和AppArmor,可以增强系统的安全性和稳定性。

防火墙配置

防火墙是网络安全的第一道防线,通过定义规则来控制进入和离开的网络流量,防止未授权访问和潜在的网络攻击。

iptables

iptables 是 Linux 内核的一个用户空间工具,用于配置和管理网络包过滤规则。虽然现代发行版逐渐转向更高级的工具(如 firewalldufw),但了解 iptables 的基础知识仍然十分重要。

基本概念与链(INPUT, OUTPUT, FORWARD)
  • 表(Table)iptables 使用不同的表来处理不同类型的规则,如 filter(默认)、natmangle
  • 链(Chain)
    :每个表包含多个链,链是规则的有序列表。主要链包括:
    • INPUT:处理进入系统的数据包。
    • OUTPUT:处理从系统发送出去的数据包。
    • FORWARD:处理通过系统转发的数据包。
添加与删除规则

添加规则

sudo iptables -A CHAIN -p protocol --dport port -j ACTION

示例:允许所有来自本地回环接口的流量

sudo iptables -A INPUT -i lo -j ACCEPT

示例:允许SSH(端口22)流量

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

删除规则

sudo iptables -D CHAIN -p protocol --dport port -j ACTION

示例:删除允许SSH(端口22)流量的规则

sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
保存与恢复规则

iptables 规则在系统重启后不会自动保留,需要手动保存和恢复。

保存规则

在Debian/Ubuntu:

sudo apt install iptables-persistent
sudo netfilter-persistent save

在CentOS/RHEL:

sudo service iptables save

恢复规则

在Debian/Ubuntu:

sudo netfilter-persistent reload

在CentOS/R

HEL:

sudo systemctl enable iptables
sudo systemctl start iptables
常用规则示例

默认策略设置

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

允许已建立和相关的连接

sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

允许HTTP和HTTPS流量

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

拒绝所有其他流量

sudo iptables -A INPUT -j DROP

保存规则

sudo iptables-save | sudo tee /etc/iptables/rules.v4

ufw

ufw(Uncomplicated Firewall)是一个用户友好的防火墙管理工具,简化了 iptables 的配置过程,特别适用于Debian和Ubuntu系统。

基本用法

启用 ufw

sudo ufw enable

禁用 ufw

sudo ufw disable

查看 ufw 状态

sudo ufw status verbose
常用命令与配置

允许特定端口

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

拒绝特定端口

sudo ufw deny 23/tcp

允许特定IP访问端口

sudo ufw allow from 192.168.1.100 to any port 22

删除规则

sudo ufw delete allow 22/tcp

启用日志记录

sudo ufw logging on
示例与应用场景

示例1:设置基本防火墙规则

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable

应用场景:

  • Web服务器配置:允许HTTP和HTTPS流量,确保Web服务正常运行。
  • 开发环境:允许SSH访问,禁止其他入站流量,确保远程管理的安全性。

firewalld

firewalld 是一个动态防火墙管理工具,提供了更高级和灵活的防火墙配置方式,支持区域和服务的概念,适用于CentOS、RHEL和Fedora等发行版。

基本概念与用法
  • 区域(Zone):定义不同的信任级别,适用于不同的网络环境(如家庭网络、公共网络)。
  • 服务(Service):预定义的一组防火墙规则,简化常见服务(如HTTP、SSH)的配置。
  • 持久性:防火墙规则可以在运行时动态调整,而无需重启服务。
配置区域与服务

查看当前区域

sudo firewall-cmd --get-active-zones

示例输出:

public
  interfaces: eth0

查看区域中的服务

sudo firewall-cmd --zone=public --list-services

示例输出:

ssh dhcpv6-client

添加服务到区域

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --reload

移除服务从区域

sudo firewall-cmd --zone=public --remove-service=ssh --permanent
sudo firewall-cmd --reload

允许特定端口

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
常用命令与示例

查看所有可用区域

sudo firewall-cmd --get-zones

查看所有可用服务

sudo firewall-cmd --get-services

允许SSH连接

sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reload

拒绝HTTP流量

sudo firewall-cmd --zone=public --remove-service=http --permanent
sudo firewall-cmd --reload

实时监控防火墙状态

sudo firewall-cmd --state

应用场景:

  • 企业网络:使用不同的区域配置内外网络流量,提高网络安全性。
  • 动态环境:根据网络环境的变化,动态添加或移除服务规则,确保系统灵活应对。

安全强化

安全强化措施通过限制系统和应用程序的权限和行为,减少潜在的攻击面,提升系统的整体安全性。

SELinux

SELinux(Security-Enhanced Linux)是一个内核模块,提供强制访问控制(MAC)机制,增强系统的安全性。

基本概念与模式(Enforcing, Permissive, Disabled)
  • Enforcing:SELinux 强制执行策略,阻止未授权的访问并记录日志。
  • Permissive:SELinux 不阻止访问,但会记录警告信息,适用于调试和策略制定。
  • Disabled:完全禁用 SELinux,不进行任何安全策略的应用。

查看 SELinux 状态

sestatus

示例输出:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
配置与管理 SELinux 策略

更改 SELinux 模式

sudo setenforce 0  # Permissive
sudo setenforce 1  # Enforcing

sudo nano /etc/selinux/config

编辑 /etc/selinux/config 文件

SELINUX=enforcing
SELINUXTYPE=targeted

安装并管理 SELinux 工具

sudo yum install policycoreutils selinux-policy-targeted

创建自定义 SELinux 策略

创建和管理自定义策略需要深入理解SELinux的策略语言和上下文。以下是一个简单的示例,展示如何为新服务创建策略。

示例:为自定义服务创建 SELinux 策略

  1. 创建策略文件

    nano myservice.te
    

    内容:

    module myservice 1.0;
    
    require {
        type httpd_t;
        class tcp_socket name_bind;
    }
    
    # Allow myservice to bind to port 8080
    allow httpd_t self:tcp_socket name_bind;
    
  2. 编译并安装策略

    sudo checkmodule -M -m -o myservice.mod myservice.te
    sudo semodule_package -o myservice.pp -m myservice.mod
    sudo semodule -i myservice.pp
    

常用命令与示例

  • 查看 SELinux 上下文

    ls -Z /path/to/file
    

    示例:

    ls -Z /var/www/html/index.html
    
  • 更改文件的 SELinux 上下文

    sudo chcon -t httpd_sys_content_t /var/www/html/index.html
    
  • 恢复默认上下文

    sudo restorecon -v /var/www/html/index.html
    

应用场景:

  • Web服务器安全:使用SELinux限制Web服务器的文件访问权限,防止潜在的文件泄露和篡改。
  • 自定义服务安全:为自定义开发的服务配置SELinux策略,确保其只能执行特定的操作。
AppArmor

AppArmor(Application Armor)是另一种Linux安全模块,提供基于路径的访问控制,旨在简化和增强系统的安全性。

基本概念与作用
  • 基于路径的访问控制:AppArmor通过配置文件定义应用程序可以访问的资源和权限。
  • 配置文件:每个受保护的程序都有一个AppArmor配置文件,通常位于 /etc/apparmor.d/ 目录下。
查看 AppArmor 状态(aa-status
sudo aa-status

示例输出:

apparmor module is loaded.
22 profiles are loaded.
22 profiles are in enforce mode.
0 profiles are in complain mode.
0 processes have a profile defined.
配置与管理 AppArmor 配置文件

编辑 AppArmor 配置文件

sudo nano /etc/apparmor.d/usr.sbin.nginx

示例内容:

/usr/sbin/nginx {
    # Include common AppArmor abstractions
    #include <abstractions/base>
    #include <abstractions/nginx>

    /var/www/** r,
    /var/log/nginx/** rw,
    /etc/nginx/** r,
    /usr/share/nginx/html/** r,
    /usr/sbin/nginx mr,
}

添加新配置文件

为新应用程序创建配置文件:

sudo nano /etc/apparmor.d/usr.bin.myapp

示例内容:

/usr/bin/myapp {
    # Include common AppArmor abstractions
    #include <abstractions/base>

    /etc/myapp/** r,
    /var/log/myapp/** rw,
    /usr/bin/myapp mr,
}
常用命令与示例
  • 启用 AppArmor
    sudo systemctl enable apparmor
    sudo systemctl start apparmor
    
  • 加载配置文件
    sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
    
  • 禁用配置文件
    sudo aa-disable /etc/apparmor.d/usr.sbin.nginx
    
  • 重新加载 AppArmor 配置
    sudo systemctl reload apparmor
    

应用场景:

  • Web服务器安全:限制Web服务器的文件访问权限,防止潜在的文件泄露和篡改。
  • 数据库安全:为数据库服务配置严格的访问控制,确保数据的完整性和保密性。
  • 自定义应用程序安全:为自定义开发的应用程序创建AppArmor配置文件,限制其操作范围,防止滥用。

本节总结

  • 本节主要围绕 Linux 安全管理、用户认证与授权、配置 sudo 权限、配置用户组与访问控制、系统安全基础 展开。
  • 需要重点掌握的命令或工具包括:sudoufwfirewalld
  • 学习时应优先抓住「命令解决什么问题、在什么场景下使用、执行后会产生什么结果」。
  • 对涉及权限、覆盖、网络、系统服务、删除或安全配置的操作,建议先在测试环境练习。

复习建议

  • 先用自己的话复述本节每个主题或命令的作用,避免只记参数不懂用途。
  • 按原文示例至少手敲一遍典型命令,并观察输出变化。
  • 对高风险操作先确认路径、权限和目标对象,再执行实际命令。
  • 可优先复习这些高频命令:sudoufwfirewalld