OpenSSH(Open Secure Shell)是一个开源的网络工具套件,主要用于 安全远程登录和数据传输。
它基于 SSH 协议,取代了早期不安全的 telnet、rlogin、ftp 等明文工具。
SSH客户端<——————————>SSH服务端
数据传输是加密的,可以防止信息泄漏
数据传输是压缩的,可以提高传输速度
OpenSSH 是实现SSH协议的开源软件项目,适用于各种UNIX、 Linux 操作系统。
Centos 7系统默认已安装openssh相关软件包,并将sshd 服务添加为开机自启动。
执行”systemctl start sshd”命令即可启动sshd 服务
sshd 服务默认使用的是TCP的22端口,安全协议版本sshv2,除了2之外还有1(有漏洞)
ssh_config:为客户端配置文件,设置与客户端相关的应用可通过此文件实现
sshd_config:为服务器端配置文件,设置与服务端相关的应用可通过此文件实现。
通俗意义上的SSH功能在此不重复赘述。
扩展命令
ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免受到DNS Hijack之类的攻击。
原因:一台主机上有多个Linux系统,会经常切换,那么这些系统使用同一ip,登录过一次后就会把ssh信息记录在本地的~/.ssh/known_hsots文件中,切换该系统后再用ssh访问这台主机就会出现冲突警告,需要手动删除修改known_hsots里面的内容。
正常情况下删除该文件即可重新对计算机进行重新记录,以下是其他的方法。
使用忽略选项
使用ssh连接远程主机时加上“-o StrictHostKeyChecking=no”的选项,如下:
ssh -o StrictHostKeyChecking=no user@192.168.xxx.xxx
此时不再核对公钥即可继续进行登录。
删除提示
修改/etc/ssh/ssh_config
(客户端)文件(或$HOME/.ssh/config
)中的配置,添加如下两行配置:
StrictHostKeyChecking no #效果与上面的相同
UserKnownHostsFile /dev/null
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系统的
服务配置与管理
服务配置
Port 22
● SSH 预设使用 22 这个port,也可以使用多个port,即重复使用 port 这个设定项!
● 例如想要开放SSHD端口为 22和222,则多加一行内容为: Port 222 即可。
● 然后重新启动SSHD这样就好了。 建议大家修改 port number 为其它端口,防止别人暴力破解。
ListenAddress 0.0.0.0
设置SSHD服务器绑定的IP 地址,0.0.0.0 表示侦听所有地址
安全建议:如果主机不需要从公网ssh访问,可以把监听地址改为内网地址 这个值可以写成本地IP地址,也可以写成所有地址,即0.0.0.0 表示所有IP。
Protocol 2
设置协议版本为SSH1或SSH2,SSH1存在漏洞与缺陷,选择SSH2
UseDNS yes
一般来说,为了要判断客户端来源是正常合法的,因此会使用 DNS 去反查客户端的主机名, 但通常在内网互连时,该基设置为 no,因此使联机速度会快些
注:禁用DNS反向解析,以提高服务器的响应速度
SyslogFacility AUTHPRIV
当有人使用 SSH 登入系统的时候,SSH 会记录信息,这个信息要记录的类型为AUTHPRIV,sshd 服务日志存放在:/var/log/secure
安全调优
LoginGraceTime 2m
● grace意思是系统给与多少秒来进行登录。(默认2分钟,0 表示无限制)
● 当使用者连上 SSH server 之后,会出现输入密码的画面,在该画面中。
● 在多久时间内没有成功连上SSHserver 就强迫断线!若无单位则默认时间为秒。可以根据实际情况来修改
PermitRootLogin yes
是否允许 root 登入,默认是允许的,但是建议设定成 no,真实的生产环境服务器,是不允许root 账号直接登陆的,仅允许普通用户登录,需要用到 root 用户再切换到root 用户。
PasswordAuthentication yes
密码验证当然是需要的!所以这里写 yes,也可以设置为 no,在真实的生产服务器上,根据不同安全级别要求,有的是设置不需要密码登陆的,通过认证的秘钥来登陆。
PermitEmptyPasswords no
是否允许空密码的用户登录,默认为no,不允许空密码登录
PrintLastLog yes
显示上次登入的信息!默认为 yes
MaxAuthTries 6
指定每个连接最大允许的认证次数。默认值是 6 。
如果失败认证的次数超过这个数值的一半,连接将被强制断开,且会生成额外的失败日志消息
AllowUsers
当希望只允许或禁止某些用户登录时,可以使用 AllowUsers 或 DenyUsers 配置,两者 用法类似(注意不要同时使用)。举例:
AllowUsers zhangsan #只允许zhangsan从任意位置登录
AllowUsers zhangsan@192.168.1.13 bob@10.0.* #只允许zhangsan从192.168.1.13登录,bob 可以从 10.0.x.x 段登录
注意:
默认情况:不写 AllowUsers
时,所有存在于系统里的用户都可以登录(当然还得密码/密钥正确)。
写了以后:只有 AllowUsers
列出的用户才行。
如果同时配置了 DenyUsers
和 AllowUsers
:
DenyUsers
优先级更高。
相关配置
AllowUsers
→ 按用户控制DenyUsers
→ 拒绝某些用户AllowGroups
/DenyGroups
→ 按用户组控制
建议:在配置 AllowUsers
前,确保至少把你现在用的用户加进去,否则你会被锁在服务器外!
扩展认证
扩展命令参数
ConnectTimeout=3
连接超时时间,3秒ConnectionAttempts=5
连接失败后重试次数,5次PasswordAuthentication=no
不使用密码认证,没有互信直接退出StrictHostKeyChecking=no
自动信任主机并添加到known_hosts文件
两种验证方式
密码验证
对服务器中本地系统用户的登录名称、密码进行验证。这种方式使用最为简便,但从客户端角度来看,正在连接的服务器有可能被假冒;从服务器角度来 看,当遭遇密码穷举(暴力破解)攻击时防御能力比较弱。
18位 密码复杂性(大写、小写、字符、数字) 端口(1023以上叫做高位端口1922)
密钥对验证
要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证,大大增强了远程管理的安全性。该方式不易被假冒,且可以免交互登录,在 Shell 中被广泛使用。
对比
当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。对于安全性要求较高的服务器,建议将密码验证方式禁用,只允许启用密钥对验证方式;若没有特殊要求,则两种方式都可启用
构建密钥对验证的SSH
公钥和私钥的关系
●在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。
●公钥用来给数据加密,用公钥加密的数据只能使用私钥解
构建密钥对验证的SSH原理:
首先ssh通过加密算法在客户端产生密钥对(公钥和私钥),公钥发送给服务器端,自己保留私钥,如果要想连接到带有公钥的SSH服务器,客户端SSH软件就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后把它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公钥加密”质询”(challenge)并把它发送给SSH客户端。
当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。可根据实际情况设置验证方式。
实验
ssh-keygen -t rsa #在客户端上执行,生成密钥对

ssh-copy-id /home/mooloco/.ssh/id_rsa.pub root@192.168.1.1 #拷贝公钥到SSH服务端
#或者也可以使用平常的文件传输方式将id_rsa.pub内容追加到~/.ssh/authorized_keys里面
在客户机设置ssh代理功能,实现免交互登录(将passphrase也实现免交互):
ssh-agent bash #开启ssh代理功能
ssh-add #添加大秘钥到ssh-agent缓存
Enter passphrase for /home/admin/.ssh/id_ecdsa: #输入私钥的密码
此时,使用 ssh再去连接,即可实现回车即进入console,不再要求验证凭据。
TCP Wrappers访问控制
将TCP服务程序“包裹”起来,代为监听TCP服务程序的端口,增加了一个安全检测过程,外来的连接请求必须先通过这层安
全检测,获得许可后才能访问真正的服务程序。
大多数Linux 发行版,TCP Wrappers 是默认提供的功能。rpm -q tcp_ wrappers
TCP Wrappers保护机制的两种实现方式
1.直接使用tcpd程序对其他服务程序进行保护,需要运行tcpd程序。
2.由其他网络服务程序调用libwrap.so.* 链接库,不需要运行tcpd 程序。此方式的应用更加广泛,也更有效率。
使用ldd命令可以查看程序的libwrap.so. *链接库
ldd $ (which ssh)
语法格式:<服务程序列表>: <客户端地址列表>
(1)服务程序列表 服务程序列表可分为以下几类。
ALL:代表所有的服务。 单个服务程序:如“vsftpd”。 多个服务程序组成的列表:如“vsftpd,sshd”。
(1)服务程序列表
ALL:代表所有的服务。
单个服务程序:如“vsftpd”.
多个服务程序组成的列表:如“vsftpd, sshd”。.
(2)客户端地址列表
ALL:代表任何客户端地址。
LOCAL:代表本机地址。
多个地址以逗号分隔
允许使用通配符“*”和”?”,前者代表任意长度字符,后者仅代表一个字符
网段地址,如”192.168.80.” 或者192.168.80.0/255.255.255.0
区域地址,如“. benet.com”匹配benet.com域中的所有主机。
访问控制的基本原则
首先检查 /etc/hosts.allow 文件,如果找到相匹配的策略,则允许访问;
否则继续检查/etc/hosts.deny 文件,如果找到相匹配的策略,则拒绝访问;
如果检查上述两个文件都找不到相匹配的策略, 则允许访问
“允许所有,拒绝个别”
只需在/etc/hosts.deny文件中添加相应的拒绝策略
“允许个别,拒绝所有”
除了在/etc/hosts.allow中添加允许策略之外,还需要在/etc/hosts
deny文件中设置”ALL:ALL”的拒绝策略。
实例:.
若只希望从IP地址为12.0.0.1的主机或者位于192.168.80.0/24网段的主机访问sshd服务,其他地址被拒绝。
vi /etc/hosts.allow
sshd,vsftpd:12.0.0.1,192.168.80.*
vi /etc/hosts.deny
sshd:ALL
sshd,vsftpd:ALL
结语
SSH 加密保证了 数据在网络传输中不被窃听或篡改,并通过密钥验证确保 只有授权用户才能访问服务器。