Linux之SELinux 概述、SSH 密钥登录、服务器初始化
1. SELinux 概述
1.1 SELinux 核心概述
1.1.1 基本定义与开发背景
- 全称:Security Enhanced Linux(安全性增强的 Linux)。
- 开发者:美国国家安全局(NSA),构建于 Linux Kernel 之上。
- 集成版本:已整合到 Linux 2.6 及以上版本的内核中,可通过
uname -r
命令查看当前内核版本。 - 安全级别:相当于信息安全评估标准(4 类 7 级:D、C1、C2、B1、B2、B3、A)中的 B1 级军事安全性能。
1.1.2 核心作用
- 增强系统安全性:防御未知攻击,限制入侵范围。即使服务器上的服务(如 Apache、httpd)被攻陷,入侵者仅能获取该服务权限,无法获得服务器最高权限,避免整个系统被控制。
- 示例:若 Apache 服务器(httpd 服务)被入侵,入侵行为仅被 “禁锢” 在 httpd 服务范围内,系统整体权限不受影响。
1.1.3 三大核心特点
特点缩写 | 全称 | 核心说明 |
---|---|---|
MAC | 强制访问控制(Mandatory Access Control) | 对文件、目录、端口的所有访问均基于管理员设定的策略,普通用户无权修改策略,实现彻底的访问控制。 |
RBAC | 基于角色的访问控制(Role Base Access Control) | 为用户分配最小权限,用户需归属特定角色(如 sysadm_r );即使是 root 用户,若不在对应角色中,也无法执行该角色的操作(如 sysadm_t 相关管理)。 |
TE | 类型强制(Type Enforcement) | 为文件赋予 type 标签、为进程赋予 domain 标签,仅允许特定 domain 标签的进程访问特定 type 标签的文件。示例: vim 进程(特定 domain )仅可读取 type 为 T1 的 a.txt ,无法读取 type 为 T2 的 b.txt 。 |
1.2 SELinux 执行模式
SELinux 有三种核心执行模式,分别对应不同的安全管控强度:
- enforcing(强制模式):严格执行 SELinux 策略,只要策略不允许的操作,就无法执行。
- permissive(警告模式):允许执行所有操作,但会将 SELinux 策略不允许的行为记录到日志中,用于测试和排查策略问题。
- disabled(关闭模式):完全关闭 SELinux,不进行任何安全管控。
1.3 SELinux 工作原理与相关文件
1.3.1 工作逻辑
- 发起请求:进程(Subject)发起访问请求(如读取文件、访问端口)。
- 策略校验:SELinux 读取安全策略数据库(Policy Database),判断该进程(对应
domain
标签)是否有权访问目标对象(文件 / 端口,对应type
标签)。 - 执行结果:
- 校验通过:允许操作(Granted)。
- 校验失败:拒绝操作(Denied),并生成 AVC(Access Vector Cache)拒绝信息。
1.3.2 相关软件包
SELinux 依赖以下默认已安装的软件包,可通过 rpm -qa | grep selinux
命令查看:
libselinux-utils-2.0.94-5.3.el6_4.1.x86_64
libselinux-devel-2.0.94-5.3.el6_4.1.x86_64
selinux-policy-3.7.19-231.el6.noarch
libselinux-python-2.0.94-5.3.el6_4.1.x86_64
selinux-policy-targeted-3.7.19-231.el6.noarch
libselinux-2.0.94-5.3.el6_4.1.x86_64
1.3.3 核心配置文件
- 路径:
/etc/sysconfig/selinux
- 查看命令:
ls /etc/sysconfig/selinux
1.4 SELinux 状态查看与切换
1.4.1 查看当前状态
通过 getenforce
命令查看 SELinux 实时运行状态,输出结果对应三种模式:
Enforcing
:当前为强制模式Permissive
:当前为警告模式Disabled
:当前为关闭模式
1.4.2 临时状态切换(无需重启,重启后失效)
- 强制模式 → 警告模式:
setenforce 0
,执行后用getenforce
验证,输出Permissive
。 - 警告模式 → 强制模式:
setenforce 1
,执行后用getenforce
验证,输出Enforcing
。 - ⚠️ 注意:此方式无法在 “关闭模式(Disabled)” 与其他模式间切换。
1.4.3 永久状态切换(需重启系统,修改配置文件)
- 编辑核心配置文件:
vim /etc/sysconfig/selinux
。 - 修改
SELINUX
字段值,设置目标模式:- 强制模式:
SELINUX=enforcing
- 警告模式:
SELINUX=permissive
- 关闭模式:
SELINUX=disabled
- 强制模式:
- 保存文件并重启系统:重启后配置生效,初次开启 SELinux 时,系统会自动更新文件标签,此过程耗时可能较长。
2. Linux SSH 基于密钥交换的自动登录原理与配置
2.1 SSH 密钥登录核心原理(协商交互过程)
SSH 密钥登录基于非对称加密算法(如 RSA),通过 “公钥加密、私钥解密” 的逻辑完成身份认证,避免每次登录输入密码,具体交互步骤如下:
- 发起请求:客户端向目标服务器发送 SSH 登录请求,若服务器启用证书验证,会优先进入证书认证流程。
- 读取公钥:服务器根据自身 SSH 配置(默认读取用户家目录下
.ssh/authorized_keys
文件),获取该客户端对应的有效公钥。 - 加密随机数:服务器生成一串唯一的随机数,使用读取到的客户端公钥对该随机数进行加密,生成密文。
- 回传密文:服务器将加密后的密文发送回客户端,作为身份验证的 “挑战信息”。
- 客户端解密:客户端查找默认私钥(路径通常为
~/.ssh/id_rsa
),或通过-i
参数指定私钥文件,尝试解密服务器发来的密文。- 若解密失败:自动切换到密码验证等其他登录方式,继续校验。
- 若解密成功:将解密得到的 “随机数原文” 重新发送给服务器,证明自己拥有对应的私钥。
- 服务器比对:服务器将客户端回传的 “随机数原文” 与自己最初生成的随机数进行比对。
- 比对成功:认证通过,客户端直接登录服务器。
- 比对失败:认证失败,切换到其他验证方式(如密码登录)。
2.2 Linux 客户端配置步骤(含参数详解与操作细节)
2.2.1 本地生成密钥对
通过 ssh-keygen
工具生成 RSA 密钥对,命令及完整参数说明如下:
[root@localhost ~]# ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
执行后会输出以下信息,代表密钥生成成功:
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa. # 私钥保存路径
Your public key has been saved in /root/.ssh/id_rsa.pub. # 公钥保存路径
The key fingerprint is:
cb:e4:e8:69:19:86:f7:52:59:95:43:40:ce:c9:06:b9 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
.000..
E..
So
+=0.
0.=十
.+..
.0.
关键参数详解
参数 | 含义 | 详细解释 |
---|---|---|
ssh-keygen | 密钥生成工具 | OpenSSH 套件内置工具,专门用于创建 SSH 认证所需的公钥 / 私钥对 |
-t rsa | 指定密钥类型 | -t 是 type 的缩写,rsa 是主流非对称加密算法,兼容性覆盖几乎所有 SSH 服务器(其他可选算法:ed25519 安全性更高、ecdsa 性能更优) |
-P '' | 设置私钥密码(Passphrase) | -P 后接密码字符串,'' (两个单引号)表示空密码。⚠️ 安全权衡:空密码允许自动化脚本无交互登录,但私钥文件若泄露,任何人可直接使用;若需高安全性,建议设置复杂密码(后续登录需输入密钥密码) |
-f /root/.ssh/id_rsa | 指定密钥保存路径 | -f 是 file 的缩写,私钥固定保存为该路径;公钥会自动在同目录下生成,文件名追加 .pub 后缀(即 /root/.ssh/id_rsa.pub )。⚠️ 若路径不存在(如 .ssh 目录),工具会自动创建,无需手动操作 |
2.2.2 复制公钥到远程服务器
通过 ssh-copy-id
工具将客户端公钥传输到远程服务器的 authorized_keys
文件(该文件是服务器识别客户端公钥的核心文件),命令如下:
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.23
操作细节与交互说明
首次连接验证:若客户端是第一次连接该服务器,会提示 “无法确认主机身份”,并显示服务器 ECDSA 密钥指纹,示例如下:
The authenticity of host '192.168.10.23(192.168.10.23)' can't be established. ECDSA key fingerprint is dd:6d:e8:68:72:c9:8f:d8:32:18:ba:19:6e:52:4a:60. Are you sure you want to continue connecting (yes/no)?
输入
yes
确认,客户端会将服务器指纹保存到~/.ssh/known_hosts
文件,后续连接不再提示。输入服务器密码:工具会尝试用当前客户端用户(此处为 root)登录服务器,需输入远程服务器的 root 密码(仅首次传输公钥时需要):
root@192.168.10.23's password: # 输入远程服务器root密码
公钥安装成功:密码验证通过后,工具会自动将客户端公钥追加到服务器
root
用户的~/.ssh/authorized_keys
文件,并提示成功:Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.10.23'"
2.2.3 测试密钥登录
无需输入密码,直接通过 SSH 命令登录服务器,验证配置是否生效:
# 登录命令
[root@localhost ~]# ssh root@192.168.10.23# 登录成功后,会显示服务器上次登录信息,并进⼊服务器命令行
Last login: Sat Mar 25 21:03:27 2017 from 192.168.77.1
[root@localhost ~]# # 已成功登录远程服务器# 验证服务器网络(可选操作)
[root@localhost ~]# ip addr list ens33 # 查看服务器网卡信息
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f0:98:fd brd ff:ff:ff:ff:ff:ff
inet 192.168.77.131/24 brd 192.168.77.255 scope global dynamic ens37
valid_lft 1280sec preferred_lft 1280sec
inet6 fe80::41e6:5671:d095:3c24/64 scope link
valid_lft forever preferred_lft forever# 退出服务器
[root@localhost ~]# exit
logout
Connection to 192.168.77.131 closed. # 连接关闭,返回客户端
2.3 Windows 客户端(Xshell)配置步骤(含界面操作与公钥处理)
2.3.1 生成 RSA 密钥对
- 打开 Xshell 软件,点击顶部菜单栏「工具」→「用户密钥管理者」,弹出 “用户密钥” 窗口。
- 点击窗口右下角「生成」按钮,启动 “新建用户密钥生成向导”。
- 选择密钥算法与长度:默认选择「RSA」算法,密钥长度默认「2048 位」(无需修改,兼容性最佳),点击「下一步」。
- 密钥生成:工具会自动生成公钥 / 私钥对,生成过程中无需操作,等待进度条完成后点击「下一步」。
- 设置密钥名称与密码:
- 「密钥名称 (K)」:默认填写
id_rsa_2048
(可自定义,便于区分多个密钥)。 - 「密码 (P)」与「确认 (C)」:留空(同 Linux 客户端,方便自动登录;高安全性场景可设置密码),直接点击「下一步」。
- 「密钥名称 (K)」:默认填写
2.3.2 复制公钥到远程服务器
- 查看并复制公钥:在 “用户密钥” 窗口中,选中刚生成的
id_rsa_2048
密钥,点击「属性 (P)」→「公钥」选项卡。- 公钥格式默认选择「SSH2-OpenSSH」,下方文本框即为公钥内容(以
ssh-rsa
开头,长字符串形式)。 - 点击「复制」按钮,或直接选中全部文本复制(确保无遗漏、无多余空格)。
- 公钥格式默认选择「SSH2-OpenSSH」,下方文本框即为公钥内容(以
- 服务器端追加公钥:通过远程连接工具(如初始密码登录)进入服务器,执行以下命令,将复制的公钥追加到
root
用户的authorized_keys
文件(若文件不存在,命令会自动创建):bash
[root@localhost ~]# echo 'ssh-rsa AAAAB3NzaC1yc2EAAAABlwAAAQEA1WPScj31fl +c8biyb9PbQILRX5s4fZkdaOAqy2d043edDkbVi0FHymyVELu5clBmJ8 of6xMmFeU +adD1GzHsT3NrNS4EZo2MKgywGVybTyjFyd77iS2rvAWdz72sZjbl4e ARKn9EQIBnHAs9jQmzxyDNQoZ0hO3IUC6a9eqp0kgj/dX31FghJzCv K5+dE9qSvGu6nRz3wN5F/xvs/hTuFzipFBwB1C51lchdrUiZcDfSrqM7m suaJhRawmuHdU8W +bfxh6qSSD1wlHy1JQ2hBrLCM/lvZkIGbGyOHoEN+KDJC +1zkP07kWhKcmF+axK0CKHSDo2lwxgYCcW9b1d7Ww==' >> /root/.ssh/authorized_keys
⚠️ 注意:将命令中的长字符串替换为自己复制的公钥内容,确保单引号包裹完整,无换行错误。
2.3.3 配置 Xshell 会话并登录
- 新建会话:点击 Xshell 顶部「文件」→「新建」,弹出 “新建会话属性” 窗口。
- 配置基本连接信息(「常规」选项卡):
- 「协议 (P)」:选择「SSH」(默认)。
- 「主机 (H)」:输入远程服务器 IP 地址(如
192.168.77.131
)。 - 「端口号 (Q)」:默认
22
(SSH 标准端口,若服务器修改过端口需对应调整)。 - 「名称 (N)」:自定义会话名称(如
Linux-Server-131
),便于区分。
- 配置公钥认证(「用户身份验证」选项卡):
- 点击左侧「连接」→「用户身份验证」,进入认证配置。
- 「方法 (M)」:选择「Public Key」(公钥认证)。
- 「用户名 (U)」:输入服务器登录用户名(如
root
,需与公钥所在用户一致)。 - 「用户密钥 (K)」:点击「浏览 (B)」,在弹出的 “选择用户密钥” 窗口中,选中之前生成的
id_rsa_2048
密钥,点击「确定」。 - 「密码 (P)」:若生成密钥时未设置密码,此处留空。
- 完成登录:点击 “新建会话属性” 窗口右下角「确定」,双击左侧会话列表中的该会话,即可无需密码直接登录服务器。
3. 服务器(CentOS 7)初始化配置
3.1 配置国内 Yum 源(加速软件安装)
替换默认国外源为国内源(阿里云 / 清华源),提升软件下载速度,步骤如下:
- 备份原有源文件:
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
- 下载主 Yum 源:
- 阿里云(推荐):
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
- 清华源(可选):
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.tuna.tsinghua.edu.cn/repo/Centos-7.repo
- 阿里云(推荐):
- 配置 EPEL 源(提供额外软件):
- 安装 EPEL 包:
sudo yum install -y epel-release
- 替换 EPEL 源为阿里云:
sudo sed -e 's|^metalink=|#metalink=|g' \ -e 's|^#baseurl=|baseurl=|g' \ -e 's|^//download.fedoraproject.org/pub|//mirrors.aliyun.com|g' \ -e 's|http://download.example|https://mirrors.aliyun.com|g' \ -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo
- 安装 EPEL 包:
- 清理并生成缓存:
sudo yum clean all && sudo yum makecache
3.2 更新系统与安装必备工具
更新系统获取安全补丁,安装常用工具便于后续维护:
- 更新系统(内核更新需重启生效):
sudo yum update -y
- 安装基础工具:
sudo yum install -y vim-enhanced wget curl telnet net-tools bash-completion lsof sysstat htop tree git unzip lrzsz
- 工具说明:
vim-enhanced
(加强版编辑器)、net-tools
(含 ifconfig)、htop
(进程监控)、lrzsz
(文件传输,sz 下载 /rz 上传)
- 工具说明:
- 可选:安装开发环境:
sudo yum groupinstall -y "Development Tools"
3.3 网络连接验证
确保服务器正常联网,为后续操作奠基:
- 查看 IP 地址(确认网卡启动):
ip addr show
或ifconfig
- 测试 DNS 解析:
ping -c 4 www.baidu.com
(-c 4 表示发送 4 个数据包) - 测试外网连通性:
ping -c 4 114.114.114.114
- 排查网络问题(若无法上网):查看网卡配置文件,
cat /etc/sysconfig/network-scripts/ifcfg-eth0
(网卡名可能为 ens33 等)
3.4 配置主机名
便于识别服务器,避免依赖 IP 管理:
- 查看当前主机名:
hostname
- 设置新主机名(示例:centos7-master):
sudo hostnamectl set-hostname centos7-master
- 修改 hosts 文件(避免软件报错):
- 编辑文件:
sudo vim /etc/hosts
- 末尾添加:
127.0.0.1 centos7-master
(替换为你的主机名)
- 编辑文件:
- 生效配置:重新登录 Shell 或执行
bash
3.5 同步系统时间
保证时间准确,对日志分析、证书验证至关重要:
- 安装 chrony 时间同步服务:
sudo yum install -y chrony
- 启动服务并设置开机自启:
sudo systemctl start chronyd && sudo systemctl enable chronyd
- 强制立即同步时间:
sudo chronyc -a makestep
- 验证时间状态:
sudo chronyc sources -v
(查看同步源)或date
(查看当前时间)
3.6 配置防火墙(两种方式)
方式 1:iptables(经典方案,适合习惯直接控制规则的场景)
核心思路
停止 firewalld → 安装 iptables 服务 → 设置默认安全策略 → 放行必要端口 → 保存规则并启用服务。
详细步骤
- 停止并禁用 firewalld:
sudo systemctl stop firewalld && sudo systemctl disable firewalld
- 安装并启动 iptables 服务:
- 安装:
sudo yum install -y iptables-services
- 启动并设为开机自启:
sudo systemctl start iptables && sudo systemctl enable iptables
- 安装:
- 设置默认策略(先执行,确保安全):
sudo iptables -P INPUT DROP # 默认拒绝所有传入流量 sudo iptables -P FORWARD DROP # 默认拒绝所有转发流量 sudo iptables -P OUTPUT ACCEPT # 默认允许所有传出流量 sudo iptables -A INPUT -i lo -j ACCEPT # 允许本地回环(系统内部通信) sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许已建立连接的返回流量
- 放行必要端口(按需选择):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 放行 SSH(远程管理必需) sudo iptables -A INPUT -p icmp -j ACCEPT # 放行 PING(网络诊断) sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 放行 HTTP sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 放行 HTTPS # 按需添加其他端口,如 MySQL(3306):sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
- 保存规则并重启服务:
- 保存规则(防止重启丢失):
sudo service iptables save
或sudo /usr/libexec/iptables/iptables.init save
- 重启服务:
sudo systemctl restart iptables
- 保存规则(防止重启丢失):
- 验证配置:
- 查看规则:
sudo iptables -L -v -n --line-numbers
(显示行号,便于删除规则) - 查看服务状态:
sudo systemctl status iptables
- 查看规则:
常用管理命令
命令 | 说明 |
---|---|
sudo iptables -L -v -n | 查看当前规则(详细模式,不解析 IP 为主机名) |
sudo iptables -L -v -n --line-numbers | 查看规则并显示行号(用于删除规则) |
sudo iptables -D INPUT <规则行号> | 删除 INPUT 链中指定行号的规则 |
sudo service iptables save | 保存当前规则 |
sudo systemctl restart iptables | 重启 iptables 服务 |
方式 2:firewalld(CentOS 7 默认,适合简化配置场景)
配置步骤
- 查看并启动服务:
- 查看状态:
sudo systemctl status firewalld
- 启动并设为开机自启(若未启动):
sudo systemctl start firewalld && sudo systemctl enable firewalld
- 查看状态:
- 查看当前开放规则:
sudo firewall-cmd --list-all
- 放行必要端口 / 服务(--permanent 表示永久生效):
sudo firewall-cmd --permanent --add-service=ssh # 放行 SSH sudo firewall-cmd --permanent --add-service=http # 放行 HTTP sudo firewall-cmd --permanent --add-service=https # 放行 HTTPS # 放行自定义端口(如 8080):sudo firewall-cmd --permanent --add-port=8080/tcp
- 重新加载配置(使规则生效):
sudo firewall-cmd --reload
- 验证规则:
sudo firewall-cmd --list-all
安全提示
若修改 SSH 端口(如改为 5922),需先放行新端口再删除旧规则,避免远程连接断开:
sudo firewall-cmd --permanent --add-port=5922/tcp
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
3.7 最终建议
完成以上配置后,执行 sudo reboot
重启服务器,确保内核更新、主机名等配置完全生效,服务器即可进入安全可用状态。
4. 总结
selinux :安全增强型,通过不同的执行模式来控制对系统的资源访问权限
三种核心模式:enforcing,permissive,disabled
ssh 公钥和私钥登录:是登录一种非对称加密技术的一个认证, 将公钥部署到目标服务器上,本地使用对应的私钥验证身份,无需输入密码即可安全的登录
服务器初始化:
① 安装yum 网络源
② 安装运维的必备工具
③ 网络验证
④ 配置主机名 并且 设置主机映射 为了加快主机之间访问速度
⑤ 时间同步
⑥ 防火墙设置,安装并且设置开放端口
⑦ 设置ssh端口以及用户的密码