OpenSSH服务
1 什么是SSH
SSH(Secure Shell)是建立在应用层基础上的安全协议,是较为可靠的专为远程登录会话和其它网络服务提供安全性的协议,它可以有效防止远程管理过程中的信息泄露问题。SSH加密所有的传输数据,可以较好地抑制“中间人”攻击、防御DNS欺骗和IP欺骗。因为SSH传输的数据是经过压缩的,所以可以加快数据的传输速度。
1.1 scp命令
scp命令作用是利用SSH协议传输文件。
1.1.1 参数
-r #目录的递归上传(下载)
-P #指定端口号连接服务器
1.1.2 格式
scp [源路径] [用户名]@[服务器IP]:[目标路径] #将本地上的文件复制到远程服务器(上传)
scp [用户名]@[服务器IP]:[源路径] [目标路径] #将远程服务器上的文件复制到本地(下载)
scp -P 8848 [用户名]@[服务器IP]:[源路径] [目标路径] #连接服务器特殊限制端口下载文件
1.1.3 说明
使用scp命令要注意所使用的用户是否具有可读取远程服务器相应文件的权限。
2 安装openssh服务
openssh默认安装在CentOS中,无须额外安装。
2.1 openssh软件包查询命令
dnf list | grep openssh
openssh-clients.x86_64 #客户端
openssh-server.x86_64 #服务端
openssh-askpass.x86_64 #交互式访问
3 ssh服务的状态/停止/启动
3.1 systemctl命令
systemctl命令用于openssh服务状态的查看和设置。
3.1.1 参数
status 状态
start 启动服务
stop 停止服务
reload 刷新配置文件
restart 重启
disable 关闭开机自动启动
enable 打开开机自动启动
3.1.2 格式
systemctl status sshd.service #查看ssh状态
systemctl start sshd.service #启动ssh服务
systemctl stop sshd.service #停止ssh服务
3.2 说明
如果ssh服务关闭,则无法远程登录服务器。
4 配置免密码(公私钥认证)登录
ssh服务主要有两种登录方式:第一种为密码口令登录,第二种为公钥登录。
4.1 公私钥的概念
密码体系从加密和解密方面来分类的话,可以分为对称加密和非对称加密。
-
对称加密:加密和解密使用的密钥是同一个。
-
非对称加密:加密和解密使用的密钥是不同的,采用两个密钥。
4.1.1 特点
-
对称加密解密的速度比较快,非对称加密和解密花费的时间长、速度相对较慢。
-
对称加密的安全性相对较低,非对称加密的安全性较高。
4.2 公私钥体系
公私钥体系既是常见的非对称加密,每个通信方均需要两个密钥,即公钥和私钥,这两把密钥可以互为加解密。
公钥是公开的,不需要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密。
4.2.1 特点
-
一个公钥对应一个私钥。
-
密钥对中,大家都知道的是公钥,自己知道的是私钥。
-
如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
-
如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。
4.3 ssh服务密码登录流程
客户端向服务端发起ssh请求->服务端收到请求,发送公钥给客户端->客户端输入用户名密码通过公钥加密,回传给服务端->服务端通过私钥解密得到用户名密码和本地进行对比,验证成功允许登录,否则再次验证
大致流程如下:
-
客户端连接上服务器之后,服务器把自己的公钥传给客户端
-
客户端输入服务器密码通过公钥加密之后传给服务器
-
服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录
4.4 ssh服务公钥登录流程
首先在客户端生成一对密钥->将公钥拷贝给服务端一份并重命名为authorized_keys->客户端向服务端发送一个连接请求,信息包括IP、用户名->服务端得到客户端的信息后,会到authorized_keys中查找,如果有响应的IP和用户名,服务端会随机生成一个字符串->服务端将字符串发送给客户端->客户端得到服务端发来的消息后,客户端会使用私钥进行加密,然后将加密后的字符串发送给服务端->服务端收到加密后的字符串会用公钥解密并跟先前生成的字符串进行比对,如果一致,就允许免密码登录
大致流程如下:
-
客户端生成RSA公钥和私钥
-
客户端将自己的公钥存放到服务器
-
客户端请求连接服务器,服务器将一个随机字符串发送给客户端
-
客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
-
服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝
4.4.1 特点
使用公私钥登录,可以避免每次登录服务器都输入密码。
4.5 ssh-keygen命令
ssh-keygen命令用于在linux下用生成密钥对(公钥、私钥)。
ssh-keygen
id_rsa #生成的私钥(存放于/root/.ssh目录下)
id_rsa.pub #生成的公钥(存放于/root/.ssh目录下)
4.6 开启免密码登录证书验证
免密码(公私钥认证)登录需要服务器开启证书的验证,默认是开启的。
若没有开启可修改ssh配置文件,步骤如下:
-
进入/etc/ssh/sshd_config配置文件
-
修改PubkeyAuthentication和AuthorizedKeysFile的有关条目
-
PubkeyAuthentication yes
-
AuthorizedKeysFile .ssh/authorized_keys
-
-
使用systemctl restart sshd.service命令重启服务
4.7 拷贝密钥文件命令
客户端使用ssh-copy-id [用户名]@[服务器地址]命令拷贝密钥文件到服务器,随后客户端可无密码登录服务器。
ssh-copy-id [用户名]@[服务器地址]
4.8 禁用密码登录
开启免密码登录证书验证后使用其它主机可以通过密码的方式登录。可修改配置文件禁止使用密码登录。
配置文件/etc/ssh/sshd_config中第70行PasswordAuthentication值改为no禁止使用密码登录
4.9 小结
客户端有私钥,被登录的服务器要有登录客户端的公钥。这个密钥对(公钥、私钥)一般在私钥宿主机(客户端)生成。上面是用rsa算法的密钥对(公钥、私钥),也可以用dsa算法(对应的文件是id_dsa,id_dsa.pub)。
例如:大数据中Hadoop的安装过程中需要配置免密钥登陆。
5 openssh 配置文件与加固
5.1 删除服务器公钥配置
登陆服务器执行删除命令:
cd .ssh
rm -rf author*
5.2 修改SSH默认端口
5.2.1 OpenSSH常用配置文件
-
ssh_config为客户端配置文件
-
sshd_config为服务端配置文件
5.2.2 操作步骤
-
编辑/etc/ssh/sshd_config配置文件
-
修改Port 22(大概为21行),取消注释,并修改端口为8848(ssh默认端口为22)
-
使用systemctl restart sshd.service命令重启ssh服务
-
ssh -p 8848 [用户名]@[服务端IP] 使用特殊端口号进行访问
5.3 配置ssh日志
查看/etc/ssh/sshd_config配置文件33-35行
5.3.1 SyslogFacility(34行)
规定了服务日志的性质,也规定了服务日志存储的默认路径。
-
AUTH表达了日志记录的是不包含敏感信息的用户身份验证消息,默认存储于/var/log/secure
-
AUTHPRIV表示当有人使用ssh登录系统时会记录信息,表达了日志记录的是包含敏感信息的用户身份验证消息,默认存储于/var/log/secure
ssh配置文件这一字段一般是不需要修改的。在LInux系统的其它服务配置文件中,可能会遇见SyslogFacility设置为其它状态的情况,其含义如下:
设置 | 描述 | 默认日志文件 |
---|---|---|
local0 | BIG-IP 特定消息 | /var/log/ltm |
local1 | EM 特定消息 APM 特定消息 | /var/log/em /var/log/apm |
loacl2 | GTM 和链路控制器特定消息 | /var/log/gtm |
local3 | ASM 特定消息 | /var/log/asm |
loacl4 | ITCM 门户和服务器 (iControl) 特定消息 | /var/log/ltm |
loacl5 | 包过滤特定消息 | /var/log/pktfilter |
loacl6 | HTTPD 特定消息 | /var/log/httpd/httpd_errors |
loacl7 | Linux 特定的引导消息 | /var/log/boot.log |
cron | 与cron进程相关的消息 | /var/log/cron |
daemon | 与系统守护进程相关的消息(包括named和ntpd) | /var/log/daemon.log |
kern | 内核消息 | /var/log/kern.log |
邮件系统消息 | /var/log/maillog | |
auth | 不包含敏感信息的用户身份验证消息 | /var/log/secure |
authpriv | 包含敏感信息的用户身份验证消息 | /var/log/secure |
user | 与用户进程相关的消息 | /var/log/user.log |
5.3.2 LogLevel(35行)
表示设置记录sshd日志信息的级别,可以理解为设置了日志的详细程度。
可将此条注释取消,将其修改为其它等级,重启ssh服务(systemctl restart sshd.service)即可。
可使用tail -f /var/log/secure命令查看日志。
INFO级别代表了日志会报告大部分有用信息,是较为详细的日志等级。除此外还有其它等级:
等级 | 描述 | 冗长度 |
---|---|---|
emerg | 紧急系统紧急信息 | 最低限度 |
alert | 需要管理员干预的严重错误 | 低的 |
crit | 严重错误,包括硬件和文件系统故障 | 低的 |
err | 非关键但可能非常重要的错误消息 | 低的 |
warning | 至少应该记录以供审查的警告消息 | 中等的 |
notice | 包含有用但可能会被忽略的消息 | 中等的 |
info | 包含有用但可能会被忽略的消息(日志默认详细级别) | 高的 |
debug | 仅用于故障排除的消息(一次登录日志一屏装不下) | 最大值 |
5.4 禁止root登录
5.4.1 操作步骤
-
进入/etc/ssh/sshd_config配置文件
-
取消注释PermitRootLogin yes并修改为PermitRootLogin no(40行)
-
使用systemctl restart sshd.service命令重启ssh服务
由于存在/etc/ssh/sshd_config.d/01-permitrootlogin.conf文件,可能修改完/etc/ssh/sshd_config配置文件后root依旧可以登录,两种解决方法如下:
-
删除/etc/ssh/sshd_config.d/01-permitrootlogin.conf文件后重启服务
-
进入/etc/ssh/sshd_config.d/01-permitrootlogin.conf文件按上述操作修改PermitRootLogin(第三行)即可
5.4.2 说明
在Authentication部分,取消注释并修改PermitRootLogin yes选项决定了用户登录方式,具体如下:
-
yes root可以登录
-
no root禁止登录
-
prohibit-password 可以使用公私钥认证登录
5.5 配置无操作自动断开ssh连接
5.5.1 操作步骤
-
进入/etc/ssh/sshd_config配置文件
-
将#LoginGraceTime 2m取消注释,调整为自己想要设定的值,即可设置指定时间内没有成功登录,将会断开连接,若无单位则默认时间为秒。(39行)
-
执行systemctl restart sshd.service命令重启服务
-
在/etc/profile配置文件末尾加上export TMOUT=10可修改一定时间后无人操作终端自动断开ssh连接,单位默认是秒。export TMOUT=10表示当命令终端超过10秒无人操作自动断开ssh连接。
-
执行source /etc/profile命令,使/etc/profile配置文件修改生效。
5.6 开启空口令登录(慎用!)
5.6.1 操作步骤
-
进入/etc/ssh/sshd_config配置文件
-
默认设置禁止空口令登录#PermitEmptyPasswords no,将其取消注释并将no改为yes。(64行)
-
执行systemctl restart sshd命令重启sshd服务使配置文件生效
5.6.2 说明
使用空口令登录须开启密码认证,即必须设置密码后清除密码,步骤如下:
-
添加新用户useradd [用户名]
-
清除用户密码passwd -d [用户名]
5.7 访问速度调优
5.7.1 操作步骤
-
进入/etc/ssh/sshd_config配置文件
-
关闭GSSAPI认证,将GSSAPIAuthentication修改为GSSAPIAuthentication no(解决ssh连接慢的问题)
-
关闭DNS解析,将UseDNS修改为UseDNS no(解决ssh连接慢的问题)
-
使用systemctl restart sshd.service命令重启服务
5.7.2 说明
一般SSH依次进行的认证方法的是publickey,gssapi-keyex,gssapi-with-mic,password。
一般用户只使用password认证方式,但前面3个认证过程系统还是会尝试,从而造成SSH登录慢。
GSSAPI主要是基于Kerberos,因此解决这个问题就要系统配置有Kerberos,一般用户没有配置Kerberos的。
5.8 启用密码策略
启用密码策略有两个配置文件: 一个是/etc/login.defs,另一个是/etc/security/pwquality.conf
5.8.1 login.defs
PASS_MAX_DAYS 99 #密码99天过期
PASS_MIN_DAYS 99 #修改密码最小间隔为99天
PASS_MIN_LEN 99 #密码最短长度为99
PASS_WARN_AGE 99 #密码过期前99天内通知用户
5.8.2 pwquality.conf
minlen=N #定义用户密码的最小长度
minclass=N #定义密码必须满足同时有几种字符
maxrepeat=N #定义密码中允许几个连续相同的字符
maxclassrepeat=N #定义用户密码连续字符的最大数目
lcredit=N #定义用户密码中必须包含多少个小写字母
ucredit=N #定义用户密码中必须包含多少个大写字母
dcredit=N #定义用户密码中必须包含多少个数字
ocredit=N #定义用户密码中必须包含多少个特殊字符(除数字、字母之外);其中=1表示,至少有一个
5.8.3 说明
密码策略修改后,只对新用户生效,可查看/etc/shadow文件判断是否生效。
6 ssh 的日志
ssh服务的日志存储于/var/log/secure文件中。可使用tail -f /var/log/secure命令查看的日志
可观察日志的不同判断登录失败,成功状态:
-
Failed password #密码错误
-
Accept password #登录成功
-
disconnected by user #断开链接
7 面试题之SSH加固
SSH如何加固?面试官想听到的是采用公私钥登录的方式,面对这种情况要怎么回答?
其中会出现有很大的回答空间,那么从头思索该如何针对这个基础的服务进行加固?
-
密码登录和公私钥登录分别适用于哪种情况?
-
口令复杂度要怎样设置合适?是不是越复杂越好?
-
是否需要禁用root用户登录?
-
登录失败次数的限定应如何设置?
-
无人操作自动断开要设置为多久为佳?
-
修改默认端口号是否有效?(nmap -sV [IP])
其它的加固思路如下:
-
利用防火墙进行访问限制
-
利用单点登录系统进行登录管理
-
利用堡垒机进行管控
-
对ssh服务日志进行监控、分析和审计
8 彩蛋
修改/etc/motd文件可更换SSH登陆提示
*********************************************
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/'---'\____
.' \\| |// '.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ '. .`___
.""'< `.___\_<| |>_/___.` >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-`======
'=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永无BUG
本文作者:HKalpa
本文链接:https://www.cnblogs.com/HKalpa/p/16742040.html
版权声明:本作品采用本人所有操作均在实验环境下进行,用于其它用途后果自负,作者不承担相应的后果。中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步