第一章:SSH服务
1.1 SSH是什么?
SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。SSH 为建立在应用层和传输层基础上的安全协议。
网络
SSH客户端<------------------------------>SSH服务端
数据传输是加密的,可以防止信息泄漏
数据传输是压缩的,可以提高传输速度
1.2 SSH客户端和服务端
-
SSH客户端: 常见的SSH客户端软件有Putty、Xshell、CRT、MobaXterm、FinalShell。
-
SSH服务端: OpenSSH 是实现SSH协议的开源软件项目,适用于各种UNIX、Linux 操作系统。
1.3 CentOS 7中的SSH
CentOS 7系统默认已安装openssh相关软件包,并将sshd服务添加为开机自启动。执行以下命令即可启动sshd服务:
systemctl start sshd
-
默认端口: sshd 服务默认使用的是TCP的22端口。
-
安全协议版本: 默认使用的是sshv2,sshv1 存在漏洞。
-
配置文件: sshd服务的默认配置文件是
/etc/ssh/sshd_config
。
1.4 SSH配置文件
-
ssh_config: 为客户端配置文件,设置与客户端相关的应用可通过此文件实现。
-
sshd_config: 为服务器端配置文件,设置与服务端相关的应用可通过此文件实现。
# 客户端配置文件路径
/etc/ssh/ssh_config
# 服务端配置文件路径
/etc/ssh/sshd_config
1.5 SSH服务功能
SSH服务端主要包括两个服务功能:SSH远程连接和SFTP服务。
1.6 SSH的作用
SSHD 服务使用 SSH 协议可以用来进行远程控制,或在计算机之间传送文件。相比于Telnet,SSH更加安全,因为Telnet使用明文传输,SSH则是加密传输。
1.7 远程管理的重要性
远程管理Linux系统基本上都要使用到SSH,原因很简单:Telnet、FTP等传输方式使用明文传送用户认证信息,本质上是不安全的,存在被网络窃听的危险。SSH(Secure Shell)目前较可靠,是专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题,通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
1.8 OpenSSH常用配置文件
OpenSSH 常用配置文件有两个:
-
ssh_config: 为客户端配置文件,设置与客户端相关的应用可通过此文件实现。
-
sshd_config: 为服务器端配置文件,设置与服务端相关的应用可通过此文件实现。
# 客户端配置文件路径
/etc/ssh/ssh_config
# 服务端配置文件路径
/etc/ssh/sshd_config
1.9 常用命令和路径
-
查看SSH版本:
ssh -V
-
服务名称:
sshd
-
服务端主程序:
/usr/sbin/sshd
-
服务端配置文件:
/etc/ssh/sshd_config
二、SSH远程登录方式
2.1 登录方法一
使用以下命令通过SSH远程登录到另一台Linux主机:
ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port
如果当前登录用户是 root
,并且连接到另一台主机时也是使用 root
用户,可以直接使用 ssh IP
,默认端口即可。如果端口不是默认的,需要使用 -p
指定端口。
例如,使用默认端口:
ssh root@192.168.1.100
使用自定义端口:
ssh root@192.168.1.100 -p 2222
RSA算法
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
2.2 登录方法二
使用 -l
选项指定登录名称和端口:
ssh -l [远程主机用户名] [远程服务器主机名或IP地址] -p port
例如:
ssh -l root 192.168.1.100 -p 2222
选项说明
-l:指定登录名称。
-p:指定登录端口(当服务端的端口非默认时,需要使用 -p 指定端口进行登录)。
2.3 初次登录提示
第一次登录服务器时,系统没有保存远程主机的信息。为了确认该主机身份,系统会提示用户是否继续连接。输入 yes
后登录,系统会将远程服务器信息写入用户主目录下的 $HOME/.ssh/known_hosts
文件中。下次再进行登录时,因为保存有该主机信息,就不会再提示了。
2.4 故障集
在平时工作中,有时候需要SSH登录到别的Linux主机上,但有时候SSH登录会被禁止,并弹出如下类似提示:
The authenticity of host '192.168.10.9 (192.168.10.9)' can't be established.
ECDSA key fingerprint is SHA256:AaGpHeEiRuXMy96oezzV6TOej5nJJmZIe/djqR7qCVk.
ECDSA key fingerprint is MD5:78:a1:b1:1c:36:76:c7:34:54:87:cc:ea:51:3f:0c:24.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.9' (ECDSA) to the list of known hosts.
Authentication failed.
2.5 扩展命令
SSH 会把每个访问过的计算机的公钥(public key)记录在 ~/.ssh/known_hosts
文件中。当下次访问相同计算机时,OpenSSH 会核对公钥。如果公钥不同,OpenSSH 会发出警告,避免受到DNS劫持之类的攻击。
解决办法
-
使用
-o StrictHostKeyChecking=no
选项:ssh -o StrictHostKeyChecking=no 192.168.xxx.xxx
-
修改
/etc/ssh/ssh_config
文件(或$HOME/.ssh/config
),添加以下配置:StrictHostKeyChecking no UserKnownHostsFile /dev/null
原因
一台主机上有多个Linux系统,会经常切换,这些系统使用同一IP。登录过一次后会把SSH信息记录在本地的 ~/.ssh/known_hosts
文件中,切换系统后再用SSH访问这台主机就会出现冲突警告,需要手动删除或修改 known_hosts
文件中的内容。
2.6 安装OpenSSH服务包
OpenSSH软件包提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,替代原来的Telnet或FTP等服务。
安装包
OpenSSH服务需要4个软件包:
-
openssh-5.3p1-114.el6_7.x86_64:包含OpenSSH服务器及客户端需要的核心文件。
-
openssh-clients-5.3p1-114.el6_7.x86_64:OpenSSH客户端软件包。
-
openssh-server-5.3p1-114.el6_7.x86_64:OpenSSH服务器软件包。
-
openssh-askpass-5.3p1-114.el6_7.x86_64:支持对话框窗口的显示,是一个基于X系统的组件。
2.7 演示远程登录的方法
编译安装OpenSSH
在进行升级或编译安装OpenSSH之前,可能存在风险,建议先安装Telnet并且测试用户登录无问题后再进行升级。
编译RPM包OpenSSH
可以通过以下命令编译并安装OpenSSH的RPM包:
rpmbuild -tb openssh-<version>.tar.gz
sudo rpm -ivh /path/to/openssh-<version>.rpm
2.8 安全机制
-
PAM(可插入认证模块):用于集中管理系统的各种认证方式。
-
用户安全:通过限制用户权限和使用强密码来增强安全性。
-
SSHD安全:通过配置SSHD服务的安全选项来保护服务器。
-
Shell脚本编辑配置安全:编写安全的Shell脚本,避免潜在的安全漏洞。
第三章:SSH 服务配置与管理
3.1 服务配置
3.1.1 修改监听端口
SSH 预设使用 22 这个端口,你可以通过在 SSH 服务器的配置文件 /etc/ssh/sshd_config
中修改或添加多个端口来改变默认端口。例如,想要开放 SSHD 端口为 22 和 222,则在配置文件中添加如下行:
# /etc/ssh/sshd_config
Port 22
Port 222
然后重新启动 SSHD 服务以应用更改:
sudo systemctl restart sshd
建议修改默认端口号以防止被恶意破解。
3.1.2 配置监听地址
在配置文件 /etc/ssh/sshd_config
中设置 SSHD 服务器绑定的 IP 地址,0.0.0.0
表示侦听所有地址:
# /etc/ssh/sshd_config
ListenAddress 0.0.0.0
安全建议:如果主机不需要从公网 SSH 访问,可以把监听地址改为内网地址。
3.1.3 设置协议版本
在配置文件 /etc/ssh/sshd_config
中设置协议版本为 SSH2,SSH1 存在漏洞与缺陷:
# /etc/ssh/sshd_config
Protocol 2
3.1.4 禁用 DNS 反向解析
在配置文件 /etc/ssh/sshd_config
中禁用 DNS 反向解析可以提高服务器的响应速度:
# /etc/ssh/sshd_config
UseDNS no
3.1.5 日志配置
在配置文件 /etc/ssh/sshd_config
中设置日志记录信息类型为 AUTHPRIV
:
# /etc/ssh/sshd_config
SyslogFacility AUTHPRIV
SSHD 服务日志存放在:/var/log/secure
。
3.2 安全调优
3.2.1 登录宽限时间
在配置文件 /etc/ssh/sshd_config
中设置登录宽限时间(默认 2 分钟),系统将在此时间内未成功登录则强制断线:
# /etc/ssh/sshd_config
LoginGraceTime 2m
3.2.2 是否允许 root 登录
在真实的生产环境中,不允许 root 用户直接登录,只允许普通用户登录后再切换到 root 用户:
# /etc/ssh/sshd_config
PermitRootLogin no
创建用户 zhangsan
和 lisi
,并将 zhangsan
用户加入 wheel
组以获取 sudo 权限:
sudo useradd zhangsan
sudo useradd lisi
sudo passwd zhangsan
sudo passwd lisi
sudo usermod -aG wheel zhangsan
3.2.3 密码验证
在配置文件 /etc/ssh/sshd_config
中配置密码验证:
# /etc/ssh/sshd_config
PasswordAuthentication yes
禁止空密码登录:
# /etc/ssh/sshd_config
PermitEmptyPasswords no
3.2.4 显示上次登录信息
在配置文件 /etc/ssh/sshd_config
中显示上次登录的信息:
# /etc/ssh/sshd_config
PrintLastLog yes
3.2.5 最大认证尝试次数
在配置文件 /etc/ssh/sshd_config
中设置每个连接最大允许的认证次数(默认值为 6):
# /etc/ssh/sshd_config
MaxAuthTries 6
3.2.6 允许用户
在配置文件 /etc/ssh/sshd_config
中使用 AllowUsers
只允许特定用户登录:
# /etc/ssh/sshd_config
AllowUsers zhangsan@192.168.10.10 wangwu
3.3 扩展命令参数
使用 ssh
命令的扩展参数:
ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyChecking=no $ip "command"
参数说明:
-
ConnectTimeout=3
:连接超时时间,3秒 -
ConnectionAttempts=5
:连接失败后重试次数,5次 -
PasswordAuthentication=no
:不使用密码认证 -
StrictHostKeyChecking=no
:自动信任主机并添加到known_hosts
文件
示例:
ssh -o StrictHostKeyChecking=no root@192.168.10.0
3.4 安全检查与加固
3.4.1 对未经过安全认证的 RPM 包进行安全检查
在使用非官方 RPM 包时,可以通过以下命令进行检查:
rpm --checksig package-name.rpm
3.4.2 用户密码策略
设定密码策略和强度: 编辑 /etc/security/pwquality.conf
文件,设置密码强度规则,例如:
minlen=12
minclass=4
对用户的登录次数进行限制: 编辑 /etc/pam.d/sshd
文件,添加以下内容:
auth required pam_tally2.so onerr=fail deny=5 unlock_time=900
禁止 ROOT 用户远程登录:
# /etc/ssh/sshd_config
PermitRootLogin no
设置历史命令保存条数和账户超时时间: 编辑 /etc/profile
文件,添加以下内容:
HISTSIZE=1000
TMOUT=300
设置只有指定用户组才能使用 su
命令切换到 root 用户: 编辑 /etc/pam.d/su
文件,添加以下内容:
auth required pam_wheel.so use_uid
对重要文件进行锁定,即使 ROOT 用户也无法删除:
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow
建立日志服务器: 设置集中日志服务器,编辑 /etc/rsyslog.conf
文件,添加远程日志服务器配置:
*.* @@remote-log-server:514
然后重启 rsyslog 服务:
sudo systemctl restart rsyslog
3.5 SSHD 服务支持的验证方式
3.5.1 密码验证
对服务器中本地系统用户的登录名称、密码进行验证。使用方便,但安全性较低,容易被假冒。
3.5.2 密钥对验证
要求提供匹配的密钥信息才能通过验证。建议将密码验证方式禁用,只允许启用密钥对验证方式。在 /etc/ssh/sshd_config
中进行配置:
# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
3.6 免密登录
在客户端使用 ssh-agent
和 ssh-add
管理公钥以实现免密登录:
在客户端生成密钥对:
ssh-keygen -t rsa
将公钥复制到服务器:
ssh-copy-id user@server
启动 ssh-agent
并添加私钥:
ssh-agent bash
ssh-add
四、SSH 密钥对验证
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上建立安全的通信通道。密钥对验证是SSH的一种重要特性,它提供了一种安全且便捷的身份验证方式。本章将详细介绍如何构建和使用SSH密钥对验证。
4.1 公钥和私钥的关系
在非对称加密技术中,有两种密钥,分别是公钥和私钥。私钥由密钥对所有者持有,不可公布;公钥由密钥对持有者公布给他人。
-
公钥用于加密数据:用公钥加密的数据只能使用私钥解密。
-
私钥用于解密数据:只有持有私钥的用户才能解密数据,从而保证了数据的安全性。
4.2 构建密钥对验证的SSH原理
-
生成密钥对:SSH客户端通过加密算法生成一对密钥(公钥和私钥)。
-
分发公钥:公钥发送给服务器端,客户端保留私钥。
-
连接过程:
-
客户端向SSH服务器发出请求,用联机的用户密钥进行验证。
-
服务器检查公钥是否匹配,如果匹配则用公钥加密"质询"(challenge)并发送给客户端。
-
客户端用私钥解密"质询",完成身份验证。
-
4.3 SSH 配置文件
修改SSH服务器的配置文件 /etc/ssh/sshd_config
以启用密钥对验证,并禁用密码验证:
vim /etc/ssh/sshd_config
PasswordAuthentication no # 禁用密码验证
PubkeyAuthentication yes # 启用密钥对验证
AuthorizedKeysFile .ssh/authorized_keys # 指定公钥库文件
4.4 生成密钥对
在客户端生成密钥对:
ssh-keygen -t rsa
根据提示完成密钥对生成,默认存放在 ~/.ssh
目录下。
4.5 上传公钥到服务器
将生成的公钥文件上传到服务器:
scp ~/.ssh/id_rsa.pub user@server:/home/user/.ssh/authorized_keys
或者使用 ssh-copy-id
命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
4.6 测试连接
在客户端使用密钥对验证连接到服务器:
ssh user@server
如果设置正确,将无需输入密码即可登录。
五、安全传输文件
在日常运维中,安全地传输文件是非常重要的。本章将介绍两种安全的文件传输方法:scp
和 sftp
。
5.1 使用 scp
进行文件传输
scp
(Secure Copy)用于在Linux下进行远程拷贝文件,传输过程是加密的。
5.1.1 本地文件复制到服务器
scp localfile user@server:/remote/path
5.1.2 服务器文件复制到本地
scp user@server:/remote/file /local/path
5.1.3 本地目录复制到服务器
scp -r localdir user@server:/remote/path
5.2 使用 sftp
进行文件传输
sftp
(Secure File Transfer Protocol)是SSH的一部分,用于安全地传输文件。
5.2.1 登录到服务器
sftp user@server
5.2.2 查看可用命令
sftp> help
5.2.3 下载文件
sftp> get remote_file /local/path
5.2.4 上传文件
sftp> put local_file /remote/path
5.2.5 切换目录和查看文件
sftp> cd remote_dir
sftp> ls
六、TCP Wrappers 访问控制
TCP Wrappers 提供了一种对TCP服务进行访问控制的机制。
6.1 安装和检查
TCP Wrappers 通常是默认安装的,可以使用以下命令检查:
rpm -q tcp_wrappers
6.2 配置访问控制
6.2.1 配置文件
-
/etc/hosts.allow
:允许访问的策略。 -
/etc/hosts.deny
:拒绝访问的策略。
6.2.2 实例
允许从 192.168.80.0/24
网段和 12.0.0.1
IP 地址访问 sshd
服务:
# /etc/hosts.allow
sshd: 192.168.80.*, 12.0.0.1
# /etc/hosts.deny
sshd: ALL