SSH(安全外壳协议)为建立在应用层基础上的安全传输协议,最常见的用途是连接服务器。由Tatu Ylonen开发,有ssh1.x和ssh2.x两个版本。
ssh允许用户通过无安全网络(例如 Internet),与远程系统之间安全访问/通信。使用 SSH 在无安全网络上发送数据时,它都会在源系统上自动加密,并且在目的系统上解密。SSH 提供了四种加密方式,基于密码认证,基于密钥认证,基于主机认证和键盘认证。最常用的认证方式是基于密码认证和基于密钥认证。
其中由于安全性问题,目前服务器端主要采用ssh2.x. Unix/Linux中主要使用open-ssh作为客户端/服务器端程序,客户端进程称为ssh,服务器端进程称为sshd。以Ubuntu为例,服务器端程序位于/usr/sbin/sshd,主要配置文件在/etc/ssh/下。

openssh的安装 & 常用服务器端命令

在安装OpenSSH之前,需要考虑到要安装的版本是否出现过比较严重的漏洞,安装最新版OpenSSH组件,及时更新即可。
漏洞参考地址:http://www.openssh.com/security.html

#/etc/ssh/ssh_config 	ssh客户端配置文件所在路径
#/etc/ssh/sshd_config	ssh服务端配置文件所在路径

#更新软件源
sudo apt update
#安装openssh组件
sudo apt install openssh-server -y
#查看系统版本
ssh -V
开启sshd服务
service sshd start
关闭sshd服务
service sshd stop
#重启sshd服务
service sshd restart
#查看sshd状态
service sshd status
#另一种启动方式
sudo /etc/init.d/ssh start 
#设置开机自启,在文件中加入/etc/init.d/ssh start
vim /etc/rc.local

远程访问

ssh [ -p ssh_port_num] [-i Private_key] user_name@server_ip
-p指定端口号,-i指定选用的私钥文件地址

配置文件

客户端的配置(/etc/ssh/ssh_config)通常没什么需要更改的,从服务器上找了一下服务区端的配置文件,梳理了一下可能会用到的各个关键字。
配置文件中关键字不区分大小写,参数区分大小写。
配置文件优先级:命令行参数 > 用户配置文件(~/.ssh/*_config) > 全局配置文件(/etc/ssh/*_config)
/etc/ssh/sshd_config配置文件如下:

#	$OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

# 设置sshd监听的端口,可修改,可保护服务器安全
# 使用防火墙须打开对应端口sudo ufw allow port_num
Port 22
#AddressFamily any
# 监听IP地址,分别为ipv4、ipv6,多ip时选定需要监听的ip,默认所有ip均接受
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Lifetime and size of ephemeral version 1 server key
# 密钥生成间隙,单位秒
KeyRegenerationInterval 3600 
# SSH服务器密钥的位数
ServerKeyBits 768

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
LogLevel VERBOSE

# 安全相关设定
# Authentication:

# 如果用户登录失败,切断连接前服务器等待时间
#LoginGraceTime 2m
# 是否允许root用户登录
PermitRootLogin prohibit-password
# ssh在接受登录请求前,检查用户目录、rhosts权限,预防低级错误
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

# 是否允许公钥验证
PubkeyAuthentication yes

# 公钥验证文件路径
AuthorizedKeysFile	/etc/ssh/authorized_keys/%u

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin yes
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
# 服务器不使用GUI,x11传输应关闭
#X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# 登录时警告字段,可选,默认关闭
#Banner /etc/banner

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem	sftp	/usr/lib/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#	X11Forwarding no
#	AllowTcpForwarding no
#	PermitTTY no
#	ForceCommand cvs server

ssh 密钥

ssh-kengen -t rsa 创建一对rsa密钥,生成完毕后,在用户目录会生成~/.ssh/和~/.ssh下的id_rsa (私钥,2048位)、id_rsa.pub (公钥,要追加到认证文件).
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys更改相应文件权限

密钥配置完毕后,确保启用sshd服务启动公钥认证,查看/etc/ssh/sshd_config 文件,确保以下两条为 yes且不是注释状态:

RSAAuthentication yes
PubkeyAuthentication yes
#指定认证文件
AuthorizedKeysFile ~/.ssh/authorized_keys

使用密钥就可以关闭密码登录了:

ChallengeResponseAuthentication no
PasswordAuthentication prohibit-password
PermitEmptyPasswords no
UsePAM no

更改完毕,重启sshd服务即可,sudo service sshd restart

其他安全措施

  • 更改ssh使用的端口号,建议10001~65535,注意端口不要和其他应用冲突
  • 针对固定IP进行允许和禁止登录编辑
    /etc/hosts.allow 配置文件中添加设置允许登录的IP
    例如:sshd:192.168.1.22:allow
    编辑/etc/hosts.deny 文件,设置sshd:ALL
    我们禁止了所有IP,但是允许了192.168.1.22这个ip登录。
  • 限制用户方式,修改sshd_config
    禁止root通过ssh登录:PermitRootLogin no
    限制ssh方式的用户登录:AllowUsers User_name
    这样之后,就只能是你允许的d4rksec用户可以通过ssh并且是使用密钥的方式才能登录
  • 使用Fail2Ban、 ConfigServer Firewall等软件防范暴力破解
  • 用 TOTP (基于时间戳的一次性动态口令)来加固 SSH 的安全,例如目前国外的主流认证之一 Google Authenticator。TOTP 原理:服务端与客户端在同等初始条件下,每隔固定时间间隔产生一串随机码。当服务和客户端在相同初始条件,时间相同,算法相同的情况下,各自产生的码是一致的,进而验证用户身份。