文章目录
引言
SSH 是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH协议对通信双方的数据传输进行加密处理,其中包括用户登录时输入的用户口令。SSH是建立在应用层和传输层基础上的安全协议,比以往的Telnet(远程登录)、RSH(远程执行命令)等传统的方式相比,SSH协议提供了更好的安全性。
一、SSH远程管理
1、OpenSSH服务器
1.1 SSH协议
- 是一种安全通道协议
 - 对通信数据进行了加密处理,用于远程管理
 
SSH客户端<---->SSH服务端
- 数据传输是加密的,可以防止信息泄露
 - 数据传输是压缩的,可以提高传输速度
 
SSH客户端:Putty、Xshell、CRT、MobaXtem、FinalShell
 SSH服务端:openSSH
SSH服务端主要包括两个服务功能:ssh远程链接和sftp服务
 作用:SSH服务使用SSH协议可以用来进行远程控制,或在计算机之间传送文件。相比较之前用的Telnet方式来传输文件要安全很多,因为Telnet使用明文传输,SSH是加密传输。
1.2 openSSH服务器配置文件
- 服务名称:sshd
 - 服务端主程序:/usr/sbin/sshd
 - 服务端配置文件:/etc/ssh/sshd_config
 - 客户端配置文件:/etc/ssh/ssh_config
 
openSSH是实现SSH协议的开源软件项目,适用于各种UNIX、Linux操作系统。
 CentOS 7系统默认已安装openssh相关软件包,并将sshd服务添加为开机自启动。
 执行"systemctl start sshd"命令即可启动sshd服务。
 sshd服务默认使用的是TCP的22端口,安全协议版本sshv2.除了2之外还有1(有漏洞)
 ssh_config和sshd_config都是ssh服务器的配置文件,二者区别在于前者是针对客户端的配置文件,后者是针对服务端的配置文件。
1.3 服务监听选项
1.31 服务配置
- 端口号、协议版本、监听IP地址
 - 禁用反向解析
 
sshd 服务使用的默认端口号为22,必要时建议修改此端口号,并指定监听服务的具体 IP 地址,以提高在网络中的隐蔽性。除此之外,SSH 协议的版本选用 V2 比 V1 的安全性要更好,禁用 DNS 反向解析可以提高服务器的响应速度。
vim /etc/ssh/sshd_config
Port 22                                                       #监听端口22
ListenAddress 0.0.0.0                                         #监听地址为0.0.0.0,表示全部监听
Protocol 2                                                    #使用SSHv2的版本
UseDNS no                                                     #禁用DNS反向解析
systemctl restart sshd                    #重启sshd服务 
 
解析:
 ListenAddress 监听地址
 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反向解析
 一般来说,为了要判断客户端来源是正常合法的,因此会使用 DNS 去反查客户端的主机名, 但通常在内网互连时,该基设置为 no,因此使联机速度会快些
 注:禁用DNS反向解析,以提高服务器的响应速度
SyslogFacility AUTHPRIV
 当有人使用 SSH 登入系统的时候,SSH 会记录信息,这个信息要记录的类型为AUTHPRIV,sshd 服务日志存放在:/var/log/secure。
 

1.32 监听端口修改实验
设置SSHD监听端口号
- SSH预设使用22 这个port,也可以使用多个port,即重复使用port这个设定项
 - 例如想要开放SSHD端口为22和1912,则多加一行内容为:Port 1912 即可
 - 然后重新启动SSHD
 
1、进入配置文件(/etc/ssh/sshd_config),首先开放一个1912端口
 
 2、可以通过1912端口访问
 
1.4 用户登录控制(安全调优)
- 禁用root用户、空密码用户
 - 限制登录验证时间、重试次数
 - AllowUsers、DenyUsers
 
vim /etc/ssh/sshd_config             #修改sshd服务的主配置文件
                                        
LoginGraceTime 2m                                        #登录验证时间为2分钟(默认2分钟)
PermitRootLogin no                                       #禁止root用户登录
MaxAuthTries 6                                           #最大重试次数为6次
PermitEmptyPasswords no                                  #禁止空密码登录
PrintLastLog yes                                        #显示上次登入的信息!默认为 yes
AllowUsers                                          #只允许或禁止某些用户登录
                             
systemctl restart sshd               #重启sshd服务
 
解析:
 LoginGraceTime 2m Grace优雅
- grace意思是系统给与多少秒来进行登录。(默认2分钟,0 表示无限制)
 - 当使用者连上 SSH server 之后,会出现输入密码的画面,在该画面中。
 - 在多久时间内没有成功连上SSHserver 就强迫断线!若无单位则默认时间为秒。可以根据实际情况来修改实际
 
PermitRootLogin yes
 是否允许 root 登入,默认是允许的,但是建议设定成 no,真实的生产环境服务器,是不允许root 账号直接登陆的,仅允许普通用户登录,需要用到 root 用户再切换到root 用户。
 案列:
 创建用户zhangsan、lisi
 查询组
 grep “wheel” /etc/group
 gpasswd -a zhangsan wheel #zhangsan 用户已加入 wheel 组
 开启pam模块
PasswordAuthentication yes
 密码验证当然是需要的!所以这里写 yes,也可以设置为 no,在真实的生产服务器上,根据不同安全级别要求,有的是设置不需要密码登陆的,通过认证的秘钥来登陆。
PubkeyAuthentication yes
 打开密钥,用于key的认证(ssh加密协议)
PermitEmptyPasswords no
 是否允许空密码的用户登录,默认为no,不允许空密码登录
PrintLastLog yes
 显示上次登入的信息!默认为 yes
MaxAuthTries 6
 指定每个连接最大允许的认证次数。默认值是 6 。
 如果失败认证的次数超过这个数值的一半,连接将被强制断开,且会生成额外的失败日志消息
 默认3次
验证ssh -o NumberOfPasswordPrompts=8 lisi@192.168.10.9
AllowUsers 相当于黑白名单
 当希望只允许或禁止某些用户登录时,可以使用 AllowUsers 或 DenyUsers 配置,两者 用法类似(注意不要同时使用)。
 配置AllowUsers
 例如,若只允许 zhangsan、wangwu 用户登录,其他(lisi)用户
 AllowUsers zhangsan@192.168.10.10 wangwu
案例:
 1、不允许root登录,仅允许普通用户认证
 

 2、设置对打允许的认证次数为4,如果失败认证的次数超过这个数值的一半,连接将被强制断开
 
 3、设置仅张三、李四用户可以登录
 
 
1.5 扩展命令参数
ssh  -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyChecking=no $ip  “ command ”
 
#ConnectTimeout=3                   连接超时时间,3秒
#ConnectionAttempts=5               连接失败后重试次数,5次
#PasswordAuthentication=no          不使用密码认证,没有互信直接退出
#StrictHostKeyChecking=no           自动信任主机并添加到known_hosts文件
 
举例:
 ssh -o StrictHostKeyChecking=no root@192.168.10.0
2、SSH远程登录方式
2.1 两种登录方法
plan 1:
ssh [远程主机用户名]@[IP地址] -p port
当在Linux主机上远程连接另一台Linux主机时,如当前所登录的用户是root的话,当连接另一台主机时也是用root用户登录时,可以直接使用ssh IP,端口
 
案例:
 
 查看登录信息
 
 
 在/etc/host里添加一行
 
 ssh可以直接通过用户名登录
 
plan 2:
ssh -l [远程主机用户名] [远程服务器主机名或IP地址] -p port
-l:指定登录名称
-p:指定登录端口(当服务器端口非默认时,需要使用-p指定端口进行登录)
 

2.2 故障集
在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登录会被禁止,并弹出如下类似提示:
The authenticity of host '192.168.109.11 (192.168.109.11)' can't be established.
ECDSA key fingerprint is SHA256:AaGpHeEiRuXMy96oezzV6Toej5nJUmZIe/djqR7qCVk.
ECDSA key fingerprint is MD5:78:al:bl:1c:36:76:c7:34:54:87:cc:ea:51:3f:0c:24.
Are you sure you want to continue connecting (yes/no) ? yes
warning: Permanently added '192.168.10.9’(ECDSA) to the list of known hosts.
Authentication failed.
 
ssh会把你每个你访问过计算机的公钥(publickey)都记录在**~/.ssh/known_hosts**。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,openSSH会发出警告,避免你受到DNS Hijack之类的攻击。
解决办法
1.使用ssh连接远程主机时加上"-o StrictHostKeyChecking=no"的选项,如下:
ssh -o .StrictHostKeyChecking=no 192.168.xxx.xxx
 
2.一个彻底去掉这个提示的方法是,修改/etc/ssh/ssh_config文件(或$HOME/.ssh/config)中的配置,添加如下两行配置:
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
 
原因:一台主机上有多个Linux系统,会经常切换,那么这些系统使用同一IP,登录过一次后就会把ssh信息记录在本地的~/.ssh/known hsots文件中,切换该系统后再用ssh访问这台主机就会出现冲突警告,需要手动删除修改known_hsots里面的内容。
2.3 openssh服务包
要安装 OpenSSH 四个安装包:
 OpenSSH软件包,提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务 Telnet 或 Ftp。
安装包:
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系统的
 
演示下远程登录的方法
 编译安装 openssh 升级 可能存在风险 必须 先安装telnet并且测试用户登录无问题才能进行升级
编译RPM包 openssh
 ensibale
安全机制:
 1、pam
 2、用户安全
 3、sshd安全
 4、shell脚本编辑配置安全
2.4 sshd服务支持的两种登录验证方式
- 密码验证:对服务器中本地系统用户的登录名称、密码进行验证。这种方式使用最为简便,但从客户端角度来看,正在连接的服务器有可能被假冒;从服务器角度来看,当遭遇密码穷举(暴力破解)攻击时防御能力比较弱。
18位 密码复杂性(大写、小写、字符、数字) 端口(1023以上叫做高位端口1922) 做好安全 - 密钥对验证:要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证,大大增强了远程管理的安全性。该方式不易被假冒,且可以免交互登录,在Shell 中被广泛使用。
 
当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。对于安全性要求较高的服务器,建议将密码验证方式禁用,只允许启用密钥对验证方式;若没有特殊要求,则 两种方式都可启用
免密登录
 ssh-agent bash #将公钥添加管理 在客户端操作
 ssh-add
当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。可根据实际情况设置验证方式。
PasswordAuthentication yes                        #启用密码验证
PubkeyAuthentication yes                          #启用密钥对验证
AuthorizedKeysFile     .ssh/authorized_keys       #指定公钥库文件(ls -a可查看)
 
3、构建密钥对验证SSH
3.1 公钥和私钥的关系
- 在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。
 - 公钥用来给数据加密,用公钥加密的数据只能使用私钥解
 
3.2 构建密钥对验证SSH的原理
首先ssh通过加密算法在客户端产生密钥对(公钥和私钥),公钥发送给服务器端,自己保留私钥,如果要想连接到带有公钥的SSH服务器,客户端SSH软件就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后把它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公钥加密"质询"(challenge)并把它发送给SSH客户端。
3.3 scp复制
安全性复制
 scp:scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,而且scp传输是加密的。
- 本地文件复制到服务器
scp li.txt root@192.168.109.11:/opt - 复制服务器的目录到本地
scp root@192.168.109.11:/home/sky/ ./ - 本地目录复制到服务器
scp -r sky2/ root@192.168.109.11:/home 
1、将本地文件复制到服务器
 
 2、复制服务器的目录到本地
 
 
 3、本地目录复制到服务器
 
3.4 sftp安全性传输
安全性传输sftp
 sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。
 sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作
 所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP
sftp root@192.168.10.10   #登陆到服务器
get下载
get anaconda-ks.cfg /home/
上传
put abc.txt  #默认时会上传的/root 
put abc.txt /home/
查看可用命令
help  #查看sftp可使用的命令和用途
打印服务器当前位置
pwd     #打印当前服务器所在位置
lpwd    #打印当前本地位置
切换目录、查看文件
cd     #切换服务器上的目录
ls     #查看当前目录下文件列表
下载文件、退出sftp
get         #下载文件
get -r      #下载目录
quit        #退出sftp
put         #上传文件
退出命令:quit、exit、bye都可以
 
1、从服务端下载文件
 
 2、上传文件到服务器
 
3.5 配置密钥对实验
1.在客户端创建密钥对
 通过ssh-keygen.工具为当前用户创建密钥对文件。可用的加密算法为RSA、ECDSA或DSA等 ( ssh-keygen命令的“-t”选项用
 于指定算法类型)。
 useradd admin
 echo “123123” | passwd --stdin admin
 su - admin
 ssh-keygen -t ecdsa
 Generating public/private ecdsa key pair.
 Enter file in which to save the key (/home/ admin/ .ssh/id_ ecdsa) :#指定私钥位置,直接回车使用默认位置
 Created directory ’ /home/admin/.ssh’. #生成的私钥、公钥文件默认存放在宿主目录中的隐藏目录.ssh/下
 Enter passphrase (empty for no passphrase) :#设置私钥的密码
 Enter same passphrase again:#确认输入
 ls -1 ~/.ssh/id ecdsa*
 #id_ ecdsa是私钥文件,权限默认为600; id_ecdsa.pub是公钥文件,用来提供给SSH 服务器
 2.将公钥文件.上传至服务器
 scp ~/.ssh/id_ecdsa.pub root@192.168.80.10:/opt
 或
 #此方法可直接在服务器的/home/zhangsan/.ssh/目录中导入公钥文本
 cd ~/.ssh/
 ssh-copy-id -i id_ ecdsa.pub zhangsan@192.168.80.10
 3. 在服务器中导入公钥文本
 mkdir /home/zhangsan/.ssh/
 cat /opt/id_ecdsa.pub >> /home/zhangsan/.ssh/authorized_keys
cat /home/zhangsan/.ssh/authorized_ keys
 4.在客户端使用密钥对验证
 ssh zhangsan@192.168.80.10
 Enter passphrase for key ‘/home/admin/.ssh/id_ecdsa’ : #输入私钥的密码
5.在客户机设置ssh代理功能,实现免交互登录;
 ssh-agent bash #开启ssh代理功能
 ssh-add #添加大秘钥到ssh-agent缓存
 Enter passphrase for /home/admin/.ssh/id_ecdsa: #输入私钥的密码
ssh zhangsan@192.168.80.10
二、TCP Wrappers访问控制
在 Linux 系统中,许多网络服务针对客户端提供了访问控制机制,如 Samba、BIND、 HTTPD、OpenSSH 等
 TCP Wrappers(TCP封套) 将 TCP 服务程序“包裹”起来,代为监听 TCP 服务程序的端口,增加了 一个安全检测过程,外来的连接请求必须先通过这层安全检测,获得许可后才能访问真正的服务程序。
1、TCP Wrappers概述
- TCP wrappers 将 TCP服务程序"包裹"起来, 代为监听 TCP
服务程序的端口,增加了一个安全检测过程,外来的连接请求必须先通过这层安全检测,获得许可后才能访问真正的服务程序 - TCP Wrappers 还可以记录所有企图访问被保护服务的行为,为管理员提供丰富的安全分析资料
 - TCP Wrappers 的访问控制是基于 TCP 协议的应用服务
 - TCP Wrappers 只能控制 TCP 协议的应用服务,并且不是所有基于 TCP 协议的应用服务都能接受它的控制
 
1.1 保护原理

1.2 保护机制的实现方式
- 直接使用 tcpd 程序对其他服务程序进行保护,需运行 tcpd 程序。
 - 由其他网络服务程序调用 libwrap.so.* 链接库,不需要运行tcpd程序,此方式的应用更广泛,更有效率。
 
1.3 访问控制策略的配置文件
- /etc/hosts.allow 允许
 - etc/hosts.deny 拒绝
 
2、TCP Wrappers策略应用
2.1 设置访问控制策略
策略格式:
语法格式:<服务程序列表>:<客户端地址列表>
服务程序列表、客户机地址列表之间以冒号分隔,在每个列表内的多个项之间以逗号分隔
 
服务程序列表:
- 多个服务以逗号分隔,ALL表示所有地址
 - 单个服务程序:如“vsftpd"
 - 多个服务程序组成的列表:如“vsftpd, sshd"
 
客户端地址列表:
- ALL:代表任何客户端地址
 - LOCAL:代表本机地址
 - 多个地址以逗号分隔
 - 允许使用通配符"*“和”?",前者代表任意长度字符,后者仅代表一个字符
 - 网段地址,如"192.168.109. "或者 192.168.109.0/255.255.255.0
 - 区域地址,如“. sky.com"匹配sky.com域中的所有主机
 
2.2 访问控制的基本原则
- 检查hosts.allow,找到匹配则允许访问
 - 再检查hosts.deny,找到则拒绝访问
 - 若两个文件中均无匹配策略,则默认允许访问
 
允许所有,拒绝个别
- 只需在/etc/hosts.deny文件中添加相应的拒绝策略
 
允许个别,拒绝所有
- 除了在/etc/hosts.allow中添加允许策略之外,还需要在/etc/hosts deny文件中设置"ALL:ALL"的拒绝策略。
 
三、总结
ssh 不仅可以用来远程登录主机,还可以借助它实现很多的远程操作自动化。










