sshd
初识ssh
SSH是一套网络协议,目的在于安全的网络服务与加密远程登录。
Linux的ssh命令是实现了ssh协议的一个操作 并且以sshd服务的形式在Linux上运行
对ssh协议管理的开源软件是主流的OpenSSH的攻击
为什么需要SSH
如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
Secure Shell是Linux系统首选的登录方式,以前使用FTP或telnet登录服务器,都是以明文的形式在网络中发送账号密码,很容易被黑客截取到数据,篡改后威胁服务器数据安全。因此如何对数据加密,安全传输是重中之重,主要方式有两种:
- 对称加密(秘钥加密)
- 非对称加密(公钥加密)
【对称加密】
加密,解密使用同一套秘钥


对称加密强度很高,难以破解,问题是当机器数量较多的时候,大量的发送密钥,难以保证密钥安全性,一旦某一个Client被窃取密钥,其他机器的安全性也就崩塌了
因此,非对称加密应运而生【非对称加密】
```shell 非对称加密分为:公钥(Public Key)与私钥(Private Key) 公钥是锁,私钥是开锁的钥匙
使用公钥加密后的密文,只能使用对应的私钥才能解开,破解的可能性很低。
<br />此种方式是私钥放在Server端,即使client在登录的时候,传输数据被窃取,黑客也没有私钥进行解密,因此保证了数据安全。<a name="wcUSu"></a>### 中间人攻击【Client如何保证自己接收到的公钥就是来源于目标Server机器的?】<br />上图看似理所当然,然而此时一位不愿意透露姓名的黑客路过,并且做了如下事情1. 拦截客户端的登录请求1. 向客户端发送黑客自己的公钥,这时客户端可能并不知道,并且用了此公钥对数据进行了加密1. 客户端发送假的公钥,加密后的数据,黑客拿到了此加密后的数据,再用自己的私钥进行解密1. 客户端的数据此时已被黑客截取<a name="MPtVY"></a>### 如何确保Server目标正确如何避免登录服务器时的安全隐患<a name="Fd6SL"></a>#### 【基于口令的验证】`特点:基于密码的登录,需要记住复杂的密码,且如果机器数量太多,难以使用密码进行管理。`<br />SSH的公私钥都是基于命令在本地生成的,没法公认,因此只能通过Client端自行的对公钥确认。```shellyumac: ~ yuchao$sshpyyuThe authenticity of host 'pyyuc (123.206.16.61)' can't be established.ECDSA key fingerprint is SHA256:CVwhwfUiD53HpLPrretR4pGltYRL6QB+5lyI.Are you sure you want to continue connecting (yes/no)? yes
这一段ssh首次连接的信息,表述的是无法确认123.206.16.61这台机器的真实性,但是知道了这台机器的指纹,SHA256:1aJYXhw/rqhK0D0SweH6wzaVOZ73HE6fDbrZBZgxi60.,让用户自行确认是否登录。
【获取远程主机的指纹信息—-根据公钥生成】
# 远程扫描服务端的指纹信息ssh-keyscan -t ecdsa 192.168.178.142 | ssh-keygen -lf -
如何验证这个公钥指纹,通过命令远程获取公钥指纹信息yumac: ~ yuchao$ssh-keyscan 123.206.16.61 |grep ecdsa# 123.206.16.61:22 SSH-2.0-OpenSSH_7.4# 123.206.16.61:22 SSH-2.0-OpenSSH_7.4# 123.206.16.61:22 SSH-2.0-OpenSSH_7.4123.206.16.61 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAATYAAABBBOsxiQ1GdeMx/xudRdmcW27sLbV76kAnjkwJeWkPXMgxb7ll3zvIGGZ8IIghD/gfivZuv0ATmnGVOW2bXWgcJBM=
对比
这个时候,Server应该展示出公钥指纹,以便用户自行核对。
可以登录server后查看指纹信息
[root@chaogelinux .ssh]# cat /etc/ssh/ssh_host_ecdsa_key.pubecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAyNTYAAABBBOsxiQ1GdeMx/xudRdmcW27sLbV76kAnjkwJeWkPXMgxb7ll3zvIGGZ8IIghD/gfivZuv0ATmnGVOW2bXWgcJBM= root@vm_32_137_centos#指纹信息通过公钥计算而来[root@chaogelinux .ssh]# ssh-keygen -E SHA256 -lf /etc/ssh/ssh_host_ecdsa_key.pub256 SHA256:CVwhwfUka2JLs1iD5GltYRL6QB+5lyI root@vm_32_137_centos (ECDSA)
也可以远程扫描server指纹信息
yumac: ~ yuchao$ssh-keyscan -t ecdsa 123.206.16.61| ssh-keygen -lf -# 123.206.16.61:22 SSH-2.0-OpenSSH_7.4256 SHA256:CVwhwfUkaLPrretR4pGltYRL6QB+5lyI 123.206.16.61 (ECDSA)
【确认server身份,准备连接】
假设用户决定连接远程主机的公钥。
Are you sure you want to continue connecting (yes/no)? yes
系统此时应该会返回一句信息
Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '123.206.16.61' (ECDSA) to the list of known hosts.root@123.206.16.61's password:
此时表示Client已经确认Server的身份,准备开始连接,输入Server机器的密码,如果密码正确,则可以登录。
【ssh配置文件】
和Linux用户有关ssh的配置文件,存放在此路径:$HOME/.ssh/
[root@chaogelinux .ssh]# pwd/root/.ssh[root@chaogelinux .ssh]# lsauthorized_keys id_rsa id_rsa.pub known_hosts
Known_hosts:当Client接收Server的公钥以后,Server的公钥信息会放在Client$HOME/.ssh/known_hosts文件中,下次再次连接的时候,系统能够识别出Server的公钥已经存在了本地,因此可以跳过警告部分,直接提示输入密码了authorized_keys:Server远程主机将用户的公钥,保存在已登录用户的$HOME/.ssh/authorized_keys文件中。id_rsa:私钥文件id_rsa.pub:公钥文件
输入正确的Server地址,用户名、密码之后,即可正确登录服务器。 也就是第一张图的登录流程
【基于公钥认证】
基于公钥的认证,可以实现免密登录,减少运维人员的心智负担
基于口令的认证存在一些缺点,每次登陆都需要输入密码,当我们机器数量众多的时候,难以维护了。
我们更希望能够免密登录公钥登录
公钥登录流程如下
- client发送自己的公钥给server,写入server的authorized_keys中
- server端接收到client的连接请求后,在自己的authorized_keys文件中匹配client的公钥信息pubkey,并且生成一个随机数R,使用client的公钥pibkey针对该随机数R进行加密,得到一个加密后的随机数pubkey(R)
- client通过私钥进行解密得到随机数R,再对随机数R和当前会话的sessionkey采用MD5生成摘要Digest1,再发送给server端
- server端会对随机数R和当前client的sessionkey用同样摘要算法生成Digest2
- 结果比较client发来的Digest1与Digest2是否一致,正确则完成认证
ssh登录原理实战
配置SSH公钥认证
1.client本地生成公私钥
[root@chaogelinux .ssh]# ssh-keygen -t rsa #指定rsa密钥类型,默认一路回车#会生成如下的公私钥Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.
2.client发送自己的公私钥到server中,存在服务器的authorized_keys文件中
#发送自己的公钥,写入到远端server的authorized_keys中yumac: ~ yuchao$ssh-copy-id root@123.206.16.61/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/yuchao/.ssh/id_rsa.pub"/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysroot@123.206.16.61's password:Number of key(s) added: 1Now try logging into the machine, with: "ssh 'root@123.206.16.61'"and check to make sure that only the key(s) you wanted were added.
3.此时可以免密登录了
yumac: ~ yuchao$ssh root@123.206.16.61 #直接输入登录命令即可Last failed login: Fri Jan 3 16:54:46 CST 2020 from 189.39.13.1 on ssh:nottyThere were 3 failed login attempts since the last successful login.Last login: Fri Jan 3 16:14:59 2020 from 222.35.146.118[root@chaogelinux ~]#[root@chaogelinux ~]# cat ~/.ssh/authorized_keysssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbkHjqnRe31HCteHc0BSfovvs9GqutyBfWvAJQy51Std1Ir3qBnHs29aKjwPL/jm/xHlZWgQ8mD/Xr091j2EVwGKUSMfCfH9nwbfu+0mwfwZKseJx5uliERShCpkRzA3Bhe6KOAqL1cgpfFzwKzO2Raga1PIGiCYcM/DIDlQh75/rEk9H5FGutamGiGrrtJfL4drRg6zEknrxSDWAMB3/MH6WUmkSWmGnECxOsPSy1PJN6Kqp1B yuchao@yumac
ssh配置文件
Linux强调一切皆文件,Linux系统中修改服务的运行参数,都是在修改程序的配置文件。
ssh服务的配置文件存放于/etc/ssh/sshd_config
[root@chaogelinux ~]# grep -Ev '^$|^[# ]' /etc/ssh/sshd_configPort 22 #默认端口AddressFamily any #配置地址家族,any支持ipv4,ipv6ListenAddress 0.0.0.0 #设置sshd服务监听的ip地址,注意多网卡的绑定HostKey /etc/ssh/ssh_host_rsa_key #ssh各密钥存放的位置HostKey /etc/ssh/ssh_host_ecdsa_keyHostKey /etc/ssh/ssh_host_ed25519_keyPermitRootLogin yes #是否允许root管理员直接登录,保证系统安全StrictModes yes #当用户的私钥改变,直接拒绝连接MaxAuthTries 6 #最大密码尝试次数MaxSessions 10 #最大终端数AuthorizedKeysFile .ssh/authorized_keys #信任主机的公钥文件存放地PasswordAuthentication yes #是否设置密码验证机制PermitEmptyPasswords no #是否允许空密码登录,禁止
对于centos7系列,默认以及安装且启用了SSHD服务,可以直接使用ssh命令登录服务器
对于生产环境,服务器一般禁止root管理员直接登录服务器,可以大大降低被黑客暴力破解的几率,需要修改sshd的主配置文件,修改如下参数
- 修改ssh端口
- 禁止root登录
- 禁止用密码登录,只能用被信任的机器,用公私钥进行登录
注意的是,修改了配置文件,重启服务方可生效PermitRootLogin yes #禁止root直接登录,使用普通用户登录安全性较高
以后直接用root登录会被禁止,应该使用普通用户登录后,sudo执行命令systemctl restart sshdsystemctl enable sshd
ssh与服务器安全实战
Linux强调一切皆文件,Linux系统更改各种软件的配置参数,也就是在修改文件内容而已
sshd服务的配置文件,默认在/etc/ssh/sshd_config ```shell 默认的sshd配置文件,如下
[root@chaoge_linux ~]# grep -Ev ‘^$|^[# ]’ /etc/ssh/sshd_config HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication no GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes UseDNS no AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server
在生产服务器下,运维人员一般会禁止root用户登录服务器,最大程度的保证服务器的安全,被黑客攻击的几率,以及修改ssh的远程连接端口- 修改ssh的端口 ,Port 23354- 禁止root登录,PermitRootLogin no- 禁止用密码登录,只能用被信任的机器,用公私钥进行登录,PasswordAuthentication no```shell修改/etc/ssh/sshd_config 文件的如下参数,此时一个安全的ssh服务器以及配置完毕,参数如下[root@chaoge_linux ~]# grep -Ev '^$|^[# ]' /etc/ssh/sshd_configPort 23354 ------gaiAddressFamily anyListenAddress 0.0.0.0HostKey /etc/ssh/ssh_host_rsa_keyHostKey /etc/ssh/ssh_host_ecdsa_keyHostKey /etc/ssh/ssh_host_ed25519_keySyslogFacility AUTHPRIVPermitRootLogin no ------gaiAuthorizedKeysFile .ssh/authorized_keysPasswordAuthentication no ------gaiChallengeResponseAuthentication noGSSAPIAuthentication noGSSAPICleanupCredentials noUsePAM yesX11Forwarding yesUseDNS noAcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGESAcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENTAcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGEAcceptEnv XMODIFIERSSubsystem sftp /usr/libexec/openssh/sftp-server
注意了,此时别立即重启服务
配置一个普通用户的账号,且支持公钥登录的形式
1.登录服务器,创建普通用户,设置登录密码useradd yuchaopasswd yuchao2.在自己本地机器,生成一个普通用户的公私钥对ssh-keygen -t rsa3.发送公钥给服务器,配置公钥登录ssh-copy-id yuchao@192.168.178.1424.在正确配置了公私钥登录之后,yuchao这个用户就可以免密登录linux服务器了ssh yuchao@192.168.178.142
在linux机器上配置yuchao用户支持sudo命令
1.使用root登录服务器,配置yuchao用户支持sudo命令vim /etc/sudoers文件添加如下行## Allow root to run any commands anywhereroot ALL=(ALL) ALLyuchao ALL=(ALL) ALL2.此时尝试用yuchao用户登录,是否能够使用sudo命令
到了最后一步了,使用root账号,重启linux的sshd服务器,以后root用户就无法使用密码登录了,只能用yuchao这个用户进行免密登录,最大程度保证服务器的安全了
1.使用root用户重启sshd服务ssh root@192.168.178.1422.重启sshd服务systemctl restart sshd3.此时机器已经禁止root登录,禁止密码登录,且修改了ssh端口为233544.此时只能使用配置好的yuchao用户进行免密登录了ssh yuchao@192.168.178.142 -p 23354
如上的学习配置,要酌情根据自己的机器环境去操作,不要太过于固执,灵活学习,灵活使用~~谢谢大家
Screen命令
作为linux服务器管理员,经常要使用ssh登陆到远程linux机器上做一些耗时的操作。
也许你遇到过使用telnet或SSH远程登录linux,运行一些程序。如果这些程序需要运行很长时间(几个小时),而程序运行过程中出现网络故障,或者客户机故障,这时候客户机与远程服务器的链接将终端,并且远程服务器没有正常结束的命令将被迫终止。 又比如你SSH到主机上后,开始批量的scp命令,如果这个ssh线程断线了,scp进程就中断了。在远程服务器上正在运行某些耗时的作业,但是工作还没做完快要下班了,退出的话就会中断操作了,如何才好呢?
因此screen命令是能够实现多窗口远程控制的一个程序,解决由于网络异常或是窗口端口导致的服务断开,还能使用screen在多个远程会话中自由切换。
- 远程会话恢复:由于网络中断,导致的会话断开,需要重新连接,screen能确保用户不会丢失对远程会话的控制
- 多窗口,运行多个远程会话
- 会话共享:多个用户同时登录到远程服务器时,可以使用会话共享功能让用户之间的数据共享
安装screen命令
```shell 1.提前配置好epel仓库源 [root@chaogelinux ~]# yum install screen -y
2.直接安装 [root@chaogelinux ~]# yum install screen -y
<a name="xbcb7"></a>### 管理远程会话Screen常用参数| **参数** | **作用** || --- | --- || -S | 创建会话窗口 || -A | 所有的窗口都调整为当前终端的大小 || -d | 断开screen进程(得有用户是Attached状态,可以用screen -list查看) || -ls | 同于-list,显示目前所有的screen || -r | 恢复离线的screen进程,可以指定多个pid.tty.host || -x | 恢复离线的screen作业 || -wipe | 检查目前所有的screen作业,并删除已经无法使用的screen作业 |【实际操作案例】```shell1.进入一个新的screen会话,名字叫做s1[root@chaogelinux ~]# screen -S s12.此时会立刻进入screen,检查会话信息[root@chaogelinux ~]# screen -lsThere is a screen on:27686.s1 (Attached)1 Socket in /var/run/screen/S-root.3.想要退出screen会话,直接输入exit[root@chaogelinux ~]# screen -S s1[screen is terminating]
screen实际应用,模拟突然端口远程会话
1.新建一个会话,执行一个持续执行的任务[root@chaogelinux ~]# screen -S myPing2.执行一个ping任务ping baidu.com3.直接关闭窗口4.检查screen会话发现有个myPing是挂掉的状态[root@chaogelinux ~]# screen -lsThere is a screen on:28570.myPing (Detached)1 Socket in /var/run/screen/S-root.5.恢复会话[root@chaogelinux ~]# screen -r myPing6.退出会话直接exit7.还可以再次尝试用screen新建一个会话,使用vim编辑文件,然后关闭窗口
会话共享
screen命令不仅可以保护用户在极端的情况下不会丢失对系统的远程控制,还可以进行会话共享,分屏切割,会话锁定等功能。
例如会话共享,可以让多个用户看到一样的内容
【利用screen完成远程协助功能】
1.小王同学创建一个screen会话,等待超哥连接screen -S shareScreen2.超哥登录服务器,查看以存在的会话信息[root@chaogelinux ~]# screen -ls3.超哥加入会话,且开始操作,协助小王解决问题,小王坐在电脑前默默观看screen -x shareScreen4.小王默默观看超哥一顿输出,解决bug5.超哥退出screen输入ctrl + a + d 组合键,留下小王满意的笑容ctrl + a + d #超哥退出screen6.小王退出screen,正常操作linuxexit

