SSH (Security Shell)

SSH(安全外壳协议)为建立在应用层基础上的安全协议。
SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

安装OpenSSH

在安装OpenSSH之前,需要考虑到要安装的版本是否出现过比较严重的漏洞,是否有缓解办法等。
建议是安装最新版的OpenSSH组件
漏洞参考地址:http://www.openssh.com/security.html

1
2
3
4
5
6
7
8
9
10
/etc/ssh/ssh_config 	 //ssh客户端配置文件所在路径
/etc/ssh/sshd_config //ssh服务端配置文件所在路径
> sudo apt-get update //更新一下软件源
> sudo apt-get install openssh-server //安装openssh组件
> ssh -V //查看系统版本
> service sshd start //开启sshd服务
> service sshd stop //关闭sshd服务
> service sshd restart //重启sshd服务
> service sshd status //查看sshd状态
> sudo /etc/init.d/ssh start //这样也是可以启动的

开机自启动
编辑 vim /etc/rc.local
添加 /etc/init.d/ssh start

远程访问
ssh IP地址
ssh -l root IP地址 //指定用户
ssh -p xxx 用户名@IP地址 //指定用户同时指定端口为xxx

ssh 命令参数
-1:强制使用ssh协议版本1;
-2:强制使用ssh协议版本2;
-4:强制使用IPv4地址;
-6:强制使用IPv6地址;
-A:开启认证代理连接转发功能;
-a:关闭认证代理连接转发功能;
-b:使用本机指定地址作为对应连接的源ip地址;
-C:请求压缩所有数据;
-F:指定ssh指令的配置文件;
-f:后台执行ssh指令;
-g:允许远程主机连接主机的转发端口;
-i:指定身份文件;
-l:指定连接远程服务器登录用户名;
-N:不执行远程指令;
-o:指定配置选项;
-p:指定远程服务器上的端口;
-q:静默模式;
-X:开启X11转发功能;
-x:关闭X11转发功能;
-y:开启信任X11转发功能。

配置文件解读

/etc/ssh/ssh_config 客户端配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Host * 	  #使用的计算机范围,'*'表示全部
# ForwardAgent no   #设置连接是否经过验证代理(如果存在)转发给远程计算机
# ForwardX11 no   #设置X11连接是否被自动重定向到安全的通道和显示集
# ForwardX11Trusted yes   #是否允许转发X11会话
# RhostsRSAAuthentication no   #设置是否使用RSA进行rhosts的安全验证
# RSAAuthentication yes    #设置是否使用RSA进行安全验证
# PasswordAuthentication yes   #设置是否需要口令验证
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
# GSSAPITrustDNS no
# BatchMode no    #如果为yes,则交互输入口令时的提示(passphrase password的提示)信息将被禁止
# CheckHostIP yes  #设置SSH是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为yes
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask   #如果设置成yes,SSH就不会自动把计算机的密钥加入$HOME/.ssh/known_hosts文件,并且一旦计算机的密匙发生了变化,就拒绝连接
# IdentityFile ~/.ssh/identity
# IdentityFile ~/.ssh/id_rsa   #RSA安全验证文件的位置
# IdentityFile ~/.ssh/id_dsa   #DSA安全验证文件的位置
# Port 22   #服务器端口
# Protocol 2   #使用的SSH协议
# Cipher 3des   #设置加密的方式
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
# EscapeChar ~   #设置Escape(转义)字符
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
# VisualHostKey no
# ProxyCommand ssh -q -W %h:%p gateway.example.com
SendEnv LANG LC_*   #局部环境变量
HashKnownHosts yes
GSSAPIAuthentication yes
GSSAPIDelegateCredentials no

/etc/ssh/sshd_config 服务端配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#	Package generated configuration file See the sshd_config(5) manpage for details
 
# What ports, IPs and protocols we listen for
Port 22 #sshd的监听端口号,默认为22
# Use these options to restrict which interfaces/protocols sshd will bind to
# ListenAddress ::
# ListenAddress 0.0.0.0   #设置sshd服务绑定的IP地址,0.0.0.0表示侦听所有地址
Protocol 2   #默认只使用2.*版本的SSH协议
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key   #SSH2版本的RSA密钥存放位置
HostKey /etc/ssh/ssh_host_dsa_key   #SSH2版本的DSA密钥存放位置
HostKey /etc/ssh/ssh_host_ecdsa_key  #SSH2版本的ECDSA密钥存放位置
# Privilege Separation is turned on for security
UsePrivilegeSeparation yes
 
# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600   #密钥每隔1小时生成一次
ServerKeyBits 768   #SSH服务器密钥的位数
 
# Logging
SyslogFacility AUTH   #设置sshd发送到syslog所使用的日志类型设置在记录来自sshd的消息时是否给出facility code
LogLevel INFO   #syslog日志级别
 
# Authentication:
LoginGraceTime 120   #设置如果用户不能成功登录,sshd将会在这个配置参数指定的时间过后断开连接(单位为秒)
PermitRootLogin yes   #如果为yes则允许root用户使用ssh登录,为no则表示不允许root进行ssh登录
StrictModes yes   #设置sshd在接受登录请求前是否检查用户的主目录以及rhosts文件的权限和所有者等信息。防止目录和文件设成任何人都有写权限
 
RSAAuthentication yes   #是否允许RSA验证
PubkeyAuthentication yes   #是否允许公钥验证
AuthorizedKeysFile %h/.ssh/authorized_keys  #公钥文件存放的位置
 
# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes   #验证时是否使用'~/.rhosts'和'~/.shosts'文件
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no   #设置是否允许用rhosts或/etc/hosts.equiv加上RSA进行安全验证
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
# IgnoreUserKnownHosts yes   #设置sshd在进行RhostsRSAAuthentication安全验证时是否信任用户的'~/.ssh/known_hosts'文件
 
# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no   #设置是否允许用空口令登录
 
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no   #设置是否允许使用提示应答式认证。sshd支持login.conf文件中定义的所有认证类型
 
# Change to no to disable tunnelled clear text passwords
# PasswordAuthentication yes   #设置是否需要口令验证,默认为yes
 
# Kerberos options   #Kerneros验证
# KerberosAuthentication no
# KerberosGetAFSToken no
# KerberosOrLocalPasswd yes
# KerberosTicketCleanup yes
 
# GSSAPI options   #GSSAPI 验证
# GSSAPIAuthentication no
# GSSAPICleanupCredentials yes   #清除验证信息
 
X11Forwarding yes   #设置sshd是否允许X11转发,默认为允许
X11DisplayOffset 10
PrintMotd no   #设置sshd是否在用户登录时显示/etc/motd中的信息
PrintLastLog yes   #交互式登录时是否输出用户上次登录的日期和时间
TCPKeepAlive yes   #TCP活动保持
# UseLogin no   #指定login命令是否可用于交互式登录会话
 
# MaxStartups 10:30:60
# Banner /etc/issue.net   #设置保存banner信息的文件位置,用户登录后会显示该banner信息
 
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*   #指定客户端发送的那些环境变量能后复制到当前会话的运行环境(客户端需要设置其配置文件ssh_config中的SendEnv参数)
 
Subsystem sftp /usr/lib/openssh/sftp-server   #用于配置一个外部的服务程序,如文件传输服务器sftp-server。配置参数的值应该是一个系统名与命令,能够基于客户系统的请求开始运行。sftp-server命令实现了sftp文件传输子系统。这个配置参数仅使用与SSH2
 
# 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 without-password". 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   #是否启用PAM插件式认证模块,默认为yes

参考链接
http://blog.csdn.net/davidsky11/article/details/24269707
http://blog.csdn.net/chenvast/article/details/72621086
http://blog.csdn.net/field_yang/article/details/51568861


SSH 加固

0x01 禁止使用口令只运行使用密钥建立SSH连接

1.创建SSH KEY
使用ssh-keygen生成一个密钥对,并且将公钥注册到服务器的$HOME/.ssh/auth_keys 文件
将密钥下载会自己使用的客户端

ssh-kengen -t rsa 表示创建一对rsa密钥
三次回车(第一次是默认名称,第二次是默认空密码或也可以输入密码防止别人盗了你的私钥文件,第三次是确认)
之后在用户的家目录会生成.ssh/(隐藏目录)和./ssh下的id_rsa (私钥,2048位)、id_rsa.pub (公钥,要追加到认证文件)

id_rsa.pub 追加到 auth_keys (默认的名字是authorized_keys,可以修改)
并且将auth_keys文件权限修改为600 (这步没做,很可能导致ssh连接不成功 认证失败)
.ssh/ 的目录也需要是700

2.确保启用SSH公钥认证功能
查看/etc/ssh/sshd_config 文件,确保以下两条为 yes且不是注释状态:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/auth_keys #指定认证文件,默认值.ssh/authorized_keys

3.禁止密码安全验证
禁止通过密码方式方式登录
编辑 /etc/ssh/sshd_config 文件:
ChallengeResponseAuthentication no
PasswordAuthentication no
PermitEmptyPasswords no
UsePAM no

当配置完后,应当重启服务sudo service sshd restart同时应打开一个ssh连接去测试效果
 

0x02 ssh配置文件加强的安全设置

限制用户方式
禁止root通过ssh登录:PermitRootLogin no
限制ssh方式的用户登录:AllowUsers d4rksec
这样之后,就只能是你允许的d4rksec用户可以通过ssh并且是使用密钥的方式才能登录
 
针对固定IP进行允许和禁止登录
编辑 /etc/hosts.allow 配置文件中添加设置允许登录的IP
例如:sshd:192.168.1.22:allow
编辑/etc/hosts.deny 文件,设置sshd:ALL
也就是说,我们禁止了所有IP,但是允许了192.168.1.22这个ip登录。
 
修改侦听的port
默认port值是22,可以修改成其它自定义端口,但要注意相关的iptables放行。
还有ListenAddress这一项是指定sshd监听的网络地址,一般只有一个IP地址的话就无所谓设置了.
如果有两张网卡,一个是内网ip,一个是外网IP,只想在内网能SSH的话就在这里设置。例如:ListenAddress 192.168.1.12:22 (这里假设服务器IP是192.168.1.12)
 
认证策略
LoginGraceTime 限制用户必须在指定的时间内认证成功,默认120秒,可修改为更短。
MaxAuthTries 指定每个连接最大允许的认证次数。默认值是6.
如果失败认证的次数超过这个数值的一半,连接将被强制断开。且会生成额外的失败日志消息。
PermitUserEnviroment 默认值是no,注意如果是yes的话要改回no,防止绕过访问控制。
注意sshd配置文件中的 Subsystem 项,和sftp有关
如果确认自己的文件通过sftp上传和下载完成后,可以考虑出于安全注释掉,要用的时候再重新开
SSH客户端选择通过密钥文件的方式登录,因为直接禁止了密码和root的登录,所以杜绝了ssh的暴力破解密码可能。
当然密钥文件就要妥善保管了。
 
客户端连接
创建密钥的时候 如果同时创建了密码,那样更保证即使密钥文件被黑客盗取也不能第一时间拿来使用
注:修改任何配置一定要重启服务
ssh -i 私钥文件(is_rsa) 远程主机用户名@远程主机ip地址 -p 端口号