OpenSSH是使用SSH协议进行远程登录的首要连接工具。它对所有通信进行加密,以消除窃听、连接劫持和其他攻击。此外,OpenSSH提供了大量的安全隧道功能、多种身份验证方法和复杂的配置选项。OpenSSH由OpenBSD Project开发,并采用BSD-style许可授权。OpenSSH套件由以下工具组成:
- 远程操作使用ssh、scp、sftp
- 密钥管理使用ssh-add、ssh-keysign、ssh-keyscan和ssh-keygen
- 服务端包括sshd、sftp-server和ssh-agent
安装OpenSSH
1)大部分Linux发行版已默认安装了OpenSSH服务器,如若没有,可以参考以下方式安装
# Debian/Ubuntu
sudo apt install openssh-server
# RHEL/Centos
sudo yum install openssh-server
# check the version
ssh -V
2)设置Firewalld/UFW(如果有)
# Firewalld
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --enable service=ssh
sudo firewall-cmd --reload
# UFW
sudo ufw allow ssh
sudo ufw status verbose
3)启动服务并设置为开机自启动
sudo systemctl start sshd
sudo systemctl status sshd
sudo systemctl enable sshd
4)添加用户(示例)
sudo adduser remote_user3
sudo passwd remote_user3
sudo usermod -aG sudo remote_user3
#RHEL/CentOS
sudo usermod -aG wheel remote_user3
id remote_user3
使用ssh-keygen生成RSA密钥
1)使用ssh-keygen命令生成RSA密钥对,通常建议按用户生成
ssh-keygen -b 4096 -t rsa \
-N new_passphrase \
-C "comment:a@b" \
-f id_rsa
其中:
-b
参数是指定密钥的二进制位数,rsa默认2048位,最小1024位,按需设定-t rsa
参数是指定采用rsa密钥类型,有 “dsa”、“ecdsa”、“ed25519”、 “rsa”等-N
参数是设置私钥的密码短语,以加固私钥本身的安全性,建议设置(非用户本身的登录密码,应注意区别)-C
参数是指定公钥的备注内容,用以注释说明-f
参数是指定密钥文件名,或者在生成过程中自定义输入,默认按id_rsa名称生成。其中id_rsa是私钥,用来存放到本地;id_rsa.pub是公钥,用来存放到远程服务嚣
2)将公钥通过ssh-copy-id
命令直接上传至远程服务嚣(推荐方法),会创建或者追加到用户的authorized_keys中
#copy the publish key to server
ssh-copy-id -i id_rsa.pub remote_user3@remote_host3
或者将id_rsa.pub内容,通过ssh传输,直接部署到远程服务器
cat /path/id_rsa.pub | \
ssh remote_user3@remote_host3 \
"mkdir -p ~/.ssh && \
cat >> ~/.ssh/authorized_keys && \
chmod 700 ~/.ssh && \
chmod 600 ~/.ssh/authorized_keys"
或者通过工具(如scp、FTP)上传至远程服务器后,在远程服务器上部署公钥
# if not exists
mkdir ~/.ssh
cat /path/id_rsa.pub > ~/.ssh/authorized_keys
# add to
cat /path/id_rsa.pub >> ~/.ssh/authorized_keys
3)检查并设置远程服务嚣公钥对应文件的隶属权限
ls -la ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
注意:如若在远程服务嚣上生成密钥,应将私钥下载到本地后,及时删除该私钥文件
配置sshd_config
主要配置文件位于/etc/ssh 目录,其中ssh_config是客户端配置文件、sshd_config是服务嚣端配置文件
建议对默认的配置文件进行复制备份,并移除写入权限,以保护其不被意外修改
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.original
sudo chmod a-w /etc/ssh/sshd_config.original
编辑sshd_config配置文件,按需要进行增改
sudo vim /etc/ssh/sshd_config
端口配置
毫无疑问,改变默认的TCP监听端口port是必要的;建议随机选用未被使用的高位(1024以上)端口
#port 22
port 4320
port 4321
严格模式
接受连接请求前,对用户主目录和相关的配置文件进行宿主和权限检查。建议开启StrictModes严格模式,以预防可能出现的低级错误
#StrictModes yes
StrictModes yes
Root登录
通过设置PermitRootLogin,禁止root用户远程连接,或者禁止root用户凭密连接,是最重要的安全配置
#PermitRootLogin yes
PermitRootLogin no
# or
#PermitRootLogin prohibit-password
应注意:如果禁止root用户连接,应至少保留一个具有sudo权限的用户,以具有对服务嚣的管理权限
密钥登录
通过PubkeyAuthentication开启密钥验证
#PubkeyAuthentication yes
PubkeyAuthentication yes
将PasswordAuthentication密码验证关闭,并同时关闭ChallengeResponseAuthentication键盘交互方式
#PasswordAuthentication yes
PasswordAuthentication no
#ChallengeResponseAuthentication no
ChallengeResponseAuthentication no
检查PermitEmptyPasswords,以禁止空密码登录
#PermitEmptyPasswords no
PermitEmptyPasswords no
检查AuthorizedKeysFile密钥认证文件路径,默认是用户主目录的.ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
通过AuthenticationMethods指定必须成功完成的身份验证方法,例如二步验证(用英文逗号分隔)
AuthenticationMethods publickey,password
登录日志
将日志级别LogLevel由INFO修改为VERBOSE,以记录更多有关登录成功和失败的日志
#LogLevel INFO
LogLevel VERBOSE
登录超时
默认设置下,通过sshd登录时,必须在出现操作提示符的2分钟内登录系统,否则将会自动切断与主机的连接。降低LoginGraceTime值,可有效防御自动化阻遏(thwarting automated)、暴力攻击ssh和拒绝服务式攻击(DDOS),默认单位为s(秒)
#LoginGraceTime 2m
LoginGraceTime 20
会话超时
通过ClientAliveInterval设置服务器向客户端发送alive消息的时间间隔(秒),并在ClientAliveCountMax应答次数之后,强制断开连接并关闭会话
#ClientAliveInterval 0
ClientAliveInterval 10
#ClientAliveCountMax 3
ClientAliveCountMax 3
验证尝试
通过MaxAuthTries把每个连接最大允许的认证次数限制为3次,3次之后拒绝登录尝试
#MaxAuthTries 6
MaxAuthTries 3
Banner
设置Banner文件指向,以显示到登录前端;客户端在尝试登录前,将显示一个类似于“你的电脑只能通过授权才能连接,不欢迎非授权用户访问“的提示内容
# no default banner path
#Banner none
Banner /etc/issue.net
然后编辑issue.net文件和内容
sudo vim /etc/issue.net
以下内容,参考US DEPARTMENT OF DEFENSE修改而成,适合大部分用户使用:
NOTICE TO USERS
This computer system is the private property of its owner, whether
individual, corporate or government. It is for authorized use only.
Users (authorized or unauthorized) have no explicit or implicit
expectation of privacy.
Any or all uses of this system and all files on this system may be
intercepted, monitored, recorded, copied, audited, inspected, and
disclosed to your employer, to authorized site, government, and law
enforcement personnel, as well as authorized officials of government
agencies, both domestic and foreign.
By using this system, the user consents to such interception, monitoring,
recording, copying, auditing, inspection, and disclosure at the
discretion of such personnel or officials. Unauthorized or improper use
of this system may result in civil and criminal penalties and
administrative or disciplinary action, as appropriate. By continuing to
use this system you indicate your awareness of and consent to these terms
and conditions of use. LOG OFF IMMEDIATELY if you do not agree to the
conditions stated in this warning.
组和用户授权
可以具体地允许或者拒绝一些特定用户组或者用户,进行ssh登录连接,多个指定之间用空格分隔。如果未设置Allow组或用户,则默认允许全部的组或用户
AllowGroups allow_group3 foo
DenyGroups deny_group3 foo
AllowUsers allow_user3 foo
DenyUsers deny_user3 foo
其它
参考官方手册,推荐检查并设置一些不怎么安全或者可能有意义的选项
#MaxSessions 10
MaxSessions 10
#HostbasedAuthentication no
HostbasedAuthentication no
#IgnoreUserKnownHosts no
IgnoreUserKnownHosts yes
#IgnoreRhosts yes
IgnoreRhosts yes
#UsePAM yes
UsePAM no
#AllowAgentForwarding yes
AllowAgentForwarding no
#AllowTcpForwarding yes
AllowTcpForwarding no
#X11Forwarding yes
X11Forwarding no
#UseDNS yes
UseDNS no
#RhostsRSAAuthentication no
RhostsRSAAuthentication no
生效重启
确定重启sshd服务之前,应注意检查二点:
- 如果在配置中更改了监听端口,应注意检查和修改Firewalld/UFW等服务中对应的规则
- 如若是远程连接到服务器进行配置,应在保持当前连接通道时,再开启另一个通道测试远程连接,以检测验正各项配置和功能;否则,有可能无法通过ssh再次连接,从而失去对远程服务嚣的控制权
验证配置,并重启SSHD服务
sshd -t
sudo systemctl restart sshd
PS:如果密钥采用dsa,sshd_config中应增加 PubkeyAcceptedKeyTypes=+ssh-dss
一行,因为自OpenSSH 7.0开始,ssh-dss密钥已默认禁用
ssh应用
控制台登录和使用(示例)
ssh remote_user3@remote_host3
ssh remote_user3@remote_host3 'ls -l ~/*.txt'
ssh -i identity_file -p port remote_user3@remote_host3
ssh -i identity_file -p port remote_user3@remote_host3 'ls -l ~/*.txt'
远程上传下载(示例)
#将公钥文件传上传至服务器上
scp -P port -i identity_file -p ~/.ssh/id_rsa.pub remote_user3@remote_host3:~/.ssh
#将本地文件拷贝到服务器上,r为递归循环目录,p为保留属性信息
scp -rp /path/src_file remote_user3@remote_host3:/path/dest_file
#将远程文件从服务器下载到本地
scp -rp remote_user3@remote_host3:/path/src_file /path/dest_file
#压缩传输
tar cvzf - /path/ | ssh remote_user3@remote_host3 "cd /some/path/; cat -> path.tar.gz"
#压缩传输一个目录并解压
tar cvzf - /path/ | ssh remote_user3@remote_host3 "cd /some/path/; tar xvzf -"
在Windows系统上,通常推荐Putty、WinSCP或者配置OpenSSH等工具进行使用