sshd

image.png

初识ssh

SSH是一套网络协议,目的在于安全的网络服务与加密远程登录。
Linux的ssh命令是实现了ssh协议的一个操作 并且以sshd服务的形式在Linux上运行
对ssh协议管理的开源软件是主流的OpenSSH的攻击

为什么需要SSH

如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
Secure Shell是Linux系统首选的登录方式,以前使用FTP或telnet登录服务器,都是以明文的形式在网络中发送账号密码,很容易被黑客截取到数据,篡改后威胁服务器数据安全。因此如何对数据加密,安全传输是重中之重,主要方式有两种:

  • 对称加密(秘钥加密)
  • 非对称加密(公钥加密)

    【对称加密】

    1. 加密,解密使用同一套秘钥
    image.png
    image.png
    对称加密强度很高,难以破解,问题是当机器数量较多的时候,大量的发送密钥,难以保证密钥安全性,一旦某一个Client被窃取密钥,其他机器的安全性也就崩塌了
    因此,非对称加密应运而生

    【非对称加密】

    ```shell 非对称加密分为:公钥(Public Key)与私钥(Private Key) 公钥是锁,私钥是开锁的钥匙

使用公钥加密后的密文,只能使用对应的私钥才能解开,破解的可能性很低。

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/12538678/1647394508009-ede15a44-3638-47bf-9085-550ae0f9414f.png#clientId=u0fef88e2-cdc8-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u60f7c9d4&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1632&originWidth=1922&originalType=url&ratio=1&rotation=0&showTitle=false&size=277685&status=done&style=none&taskId=u3d426792-1366-4cc8-bf5b-214e45b395c&title=)<br />此种方式是私钥放在Server端,即使client在登录的时候,传输数据被窃取,黑客也没有私钥进行解密,因此保证了数据安全。
  2. <a name="wcUSu"></a>
  3. ### 中间人攻击
  4. Client如何保证自己接收到的公钥就是来源于目标Server机器的?】<br />上图看似理所当然,然而此时一位不愿意透露姓名的黑客路过,并且做了如下事情
  5. 1. 拦截客户端的登录请求
  6. 1. 向客户端发送黑客自己的公钥,这时客户端可能并不知道,并且用了此公钥对数据进行了加密
  7. 1. 客户端发送假的公钥,加密后的数据,黑客拿到了此加密后的数据,再用自己的私钥进行解密
  8. 1. 客户端的数据此时已被黑客截取![image.png](https://cdn.nlark.com/yuque/0/2022/png/12538678/1647394508008-0199f614-5cff-4e58-a3e7-a5f9ca593db1.png#clientId=u0fef88e2-cdc8-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ub1e84c2f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1612&originWidth=1546&originalType=url&ratio=1&rotation=0&showTitle=false&size=217579&status=done&style=none&taskId=ub90e2766-aa3c-43ca-8831-cdab5d53a3a&title=)
  9. <a name="MPtVY"></a>
  10. ### 如何确保Server目标正确
  11. 如何避免登录服务器时的安全隐患
  12. <a name="Fd6SL"></a>
  13. #### 【基于口令的验证】
  14. `特点:基于密码的登录,需要记住复杂的密码,且如果机器数量太多,难以使用密码进行管理。`<br />SSH的公私钥都是基于命令在本地生成的,没法公认,因此只能通过Client端自行的对公钥确认。
  15. ```shell
  16. yumac: ~ yuchao$sshpyyu
  17. The authenticity of host 'pyyuc (123.206.16.61)' can't be established.
  18. ECDSA key fingerprint is SHA256:CVwhwfUiD53HpLPrretR4pGltYRL6QB+5lyI.
  19. Are you sure you want to continue connecting (yes/no)? yes

这一段ssh首次连接的信息,表述的是无法确认123.206.16.61这台机器的真实性,但是知道了这台机器的指纹,SHA256:1aJYXhw/rqhK0D0SweH6wzaVOZ73HE6fDbrZBZgxi60.,让用户自行确认是否登录。
【获取远程主机的指纹信息—-根据公钥生成】

  1. # 远程扫描服务端的指纹信息
  2. ssh-keyscan -t ecdsa 192.168.178.142 | ssh-keygen -lf -
  1. 如何验证这个公钥指纹,通过命令远程获取公钥指纹信息
  2. yumac: ~ yuchao$ssh-keyscan 123.206.16.61 |grep ecdsa
  3. # 123.206.16.61:22 SSH-2.0-OpenSSH_7.4
  4. # 123.206.16.61:22 SSH-2.0-OpenSSH_7.4
  5. # 123.206.16.61:22 SSH-2.0-OpenSSH_7.4
  6. 123.206.16.61 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAATYAAABBBOsxiQ1GdeMx/xudRdmcW27sLbV76kAnjkwJeWkPXMgxb7ll3zvIGGZ8IIghD/gfivZuv0ATmnGVOW2bXWgcJBM=

对比
这个时候,Server应该展示出公钥指纹,以便用户自行核对。
可以登录server后查看指纹信息

  1. [root@chaogelinux .ssh]# cat /etc/ssh/ssh_host_ecdsa_key.pub
  2. ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAyNTYAAABBBOsxiQ1GdeMx/xudRdmcW27sLbV76kAnjkwJeWkPXMgxb7ll3zvIGGZ8IIghD/gfivZuv0ATmnGVOW2bXWgcJBM= root@vm_32_137_centos
  3. #指纹信息通过公钥计算而来
  4. [root@chaogelinux .ssh]# ssh-keygen -E SHA256 -lf /etc/ssh/ssh_host_ecdsa_key.pub
  5. 256 SHA256:CVwhwfUka2JLs1iD5GltYRL6QB+5lyI root@vm_32_137_centos (ECDSA)

也可以远程扫描server指纹信息

  1. yumac: ~ yuchao$ssh-keyscan -t ecdsa 123.206.16.61| ssh-keygen -lf -
  2. # 123.206.16.61:22 SSH-2.0-OpenSSH_7.4
  3. 256 SHA256:CVwhwfUkaLPrretR4pGltYRL6QB+5lyI 123.206.16.61 (ECDSA)

【确认server身份,准备连接】
假设用户决定连接远程主机的公钥。

  1. Are you sure you want to continue connecting (yes/no)? yes

系统此时应该会返回一句信息

  1. Are you sure you want to continue connecting (yes/no)? yes
  2. Warning: Permanently added '123.206.16.61' (ECDSA) to the list of known hosts.
  3. root@123.206.16.61's password:

此时表示Client已经确认Server的身份,准备开始连接,输入Server机器的密码,如果密码正确,则可以登录。
【ssh配置文件】
和Linux用户有关ssh的配置文件,存放在此路径:$HOME/.ssh/

  1. [root@chaogelinux .ssh]# pwd
  2. /root/.ssh
  3. [root@chaogelinux .ssh]# ls
  4. authorized_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地址,用户名、密码之后,即可正确登录服务器。 也就是第一张图的登录流程

【基于公钥认证】

基于公钥的认证,可以实现免密登录,减少运维人员的心智负担
基于口令的认证存在一些缺点,每次登陆都需要输入密码,当我们机器数量众多的时候,难以维护了。
我们更希望能够免密登录公钥登录
image.png
公钥登录流程如下

  1. client发送自己的公钥给server,写入server的authorized_keys中
  2. server端接收到client的连接请求后,在自己的authorized_keys文件中匹配client的公钥信息pubkey,并且生成一个随机数R,使用client的公钥pibkey针对该随机数R进行加密,得到一个加密后的随机数pubkey(R)
  3. client通过私钥进行解密得到随机数R,再对随机数R和当前会话的sessionkey采用MD5生成摘要Digest1,再发送给server端
  4. server端会对随机数R和当前client的sessionkey用同样摘要算法生成Digest2
  5. 结果比较client发来的Digest1与Digest2是否一致,正确则完成认证

ssh登录原理实战

image.png
image.png

配置SSH公钥认证

1.client本地生成公私钥

  1. [root@chaogelinux .ssh]# ssh-keygen -t rsa #指定rsa密钥类型,默认一路回车
  2. #会生成如下的公私钥
  3. Your identification has been saved in /root/.ssh/id_rsa.
  4. Your public key has been saved in /root/.ssh/id_rsa.pub.

2.client发送自己的公私钥到server中,存在服务器的authorized_keys文件中

  1. #发送自己的公钥,写入到远端server的authorized_keys中
  2. yumac: ~ yuchao$ssh-copy-id root@123.206.16.61
  3. /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/yuchao/.ssh/id_rsa.pub"
  4. /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
  5. /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
  6. root@123.206.16.61's password:
  7. Number of key(s) added: 1
  8. Now try logging into the machine, with: "ssh 'root@123.206.16.61'"
  9. and check to make sure that only the key(s) you wanted were added.

3.此时可以免密登录了

  1. yumac: ~ yuchao$ssh root@123.206.16.61 #直接输入登录命令即可
  2. Last failed login: Fri Jan 3 16:54:46 CST 2020 from 189.39.13.1 on ssh:notty
  3. There were 3 failed login attempts since the last successful login.
  4. Last login: Fri Jan 3 16:14:59 2020 from 222.35.146.118
  5. [root@chaogelinux ~]#
  6. [root@chaogelinux ~]# cat ~/.ssh/authorized_keys
  7. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbkHjqnRe31HCteHc0BSfovvs9GqutyBfWvAJQy51Std1Ir3qBnHs29aKjwPL/jm/xHlZWgQ8mD/Xr091j2EVwGKUSMfCfH9nwbfu+0mwfwZKseJx5uliERShCpkRzA3Bhe6KOAqL1cgpfFzwKzO2Raga1PIGiCYcM/DIDlQh75/rEk9H5FGutamGiGrrtJfL4drRg6zEknrxSDWAMB3/MH6WUmkSWmGnECxOsPSy1PJN6Kqp1B yuchao@yumac

ssh配置文件

Linux强调一切皆文件,Linux系统中修改服务的运行参数,都是在修改程序的配置文件。
ssh服务的配置文件存放于/etc/ssh/sshd_config

  1. [root@chaogelinux ~]# grep -Ev '^$|^[# ]' /etc/ssh/sshd_config
  2. Port 22 #默认端口
  3. AddressFamily any #配置地址家族,any支持ipv4,ipv6
  4. ListenAddress 0.0.0.0 #设置sshd服务监听的ip地址,注意多网卡的绑定
  5. HostKey /etc/ssh/ssh_host_rsa_key #ssh各密钥存放的位置
  6. HostKey /etc/ssh/ssh_host_ecdsa_key
  7. HostKey /etc/ssh/ssh_host_ed25519_key
  8. PermitRootLogin yes #是否允许root管理员直接登录,保证系统安全
  9. StrictModes yes #当用户的私钥改变,直接拒绝连接
  10. MaxAuthTries 6 #最大密码尝试次数
  11. MaxSessions 10 #最大终端数
  12. AuthorizedKeysFile .ssh/authorized_keys #信任主机的公钥文件存放地
  13. PasswordAuthentication yes #是否设置密码验证机制
  14. PermitEmptyPasswords no #是否允许空密码登录,禁止

对于centos7系列,默认以及安装且启用了SSHD服务,可以直接使用ssh命令登录服务器
对于生产环境,服务器一般禁止root管理员直接登录服务器,可以大大降低被黑客暴力破解的几率,需要修改sshd的主配置文件,修改如下参数

  1. 修改ssh端口
  2. 禁止root登录
  3. 禁止用密码登录,只能用被信任的机器,用公私钥进行登录
    1. PermitRootLogin yes #禁止root直接登录,使用普通用户登录安全性较高
    注意的是,修改了配置文件,重启服务方可生效
    1. systemctl restart sshd
    2. systemctl enable sshd
    以后直接用root登录会被禁止,应该使用普通用户登录后,sudo执行命令

    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

  1. 在生产服务器下,运维人员一般会禁止root用户登录服务器,最大程度的保证服务器的安全,被黑客攻击的几率,以及修改ssh的远程连接端口
  2. - 修改ssh的端口 Port 23354
  3. - 禁止root登录,PermitRootLogin no
  4. - 禁止用密码登录,只能用被信任的机器,用公私钥进行登录,PasswordAuthentication no
  5. ```shell
  6. 修改/etc/ssh/sshd_config 文件的如下参数,此时一个安全的ssh服务器以及配置完毕,参数如下
  7. [root@chaoge_linux ~]# grep -Ev '^$|^[# ]' /etc/ssh/sshd_config
  8. Port 23354 ------gai
  9. AddressFamily any
  10. ListenAddress 0.0.0.0
  11. HostKey /etc/ssh/ssh_host_rsa_key
  12. HostKey /etc/ssh/ssh_host_ecdsa_key
  13. HostKey /etc/ssh/ssh_host_ed25519_key
  14. SyslogFacility AUTHPRIV
  15. PermitRootLogin no ------gai
  16. AuthorizedKeysFile .ssh/authorized_keys
  17. PasswordAuthentication no ------gai
  18. ChallengeResponseAuthentication no
  19. GSSAPIAuthentication no
  20. GSSAPICleanupCredentials no
  21. UsePAM yes
  22. X11Forwarding yes
  23. UseDNS no
  24. AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
  25. AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
  26. AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
  27. AcceptEnv XMODIFIERS
  28. Subsystem sftp /usr/libexec/openssh/sftp-server

注意了,此时别立即重启服务
配置一个普通用户的账号,且支持公钥登录的形式

  1. 1.登录服务器,创建普通用户,设置登录密码
  2. useradd yuchao
  3. passwd yuchao
  4. 2.在自己本地机器,生成一个普通用户的公私钥对
  5. ssh-keygen -t rsa
  6. 3.发送公钥给服务器,配置公钥登录
  7. ssh-copy-id yuchao@192.168.178.142
  8. 4.在正确配置了公私钥登录之后,yuchao这个用户就可以免密登录linux服务器了
  9. ssh yuchao@192.168.178.142

在linux机器上配置yuchao用户支持sudo命令

  1. 1.使用root登录服务器,配置yuchao用户支持sudo命令
  2. vim /etc/sudoers文件
  3. 添加如下行
  4. ## Allow root to run any commands anywhere
  5. root ALL=(ALL) ALL
  6. yuchao ALL=(ALL) ALL
  7. 2.此时尝试用yuchao用户登录,是否能够使用sudo命令

到了最后一步了,使用root账号,重启linux的sshd服务器,以后root用户就无法使用密码登录了,只能用yuchao这个用户进行免密登录,最大程度保证服务器的安全了

  1. 1.使用root用户重启sshd服务
  2. ssh root@192.168.178.142
  3. 2.重启sshd服务
  4. systemctl restart sshd
  5. 3.此时机器已经禁止root登录,禁止密码登录,且修改了ssh端口为23354
  6. 4.此时只能使用配置好的yuchao用户进行免密登录了
  7. 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

  1. <a name="xbcb7"></a>
  2. ### 管理远程会话
  3. Screen常用参数
  4. | **参数** | **作用** |
  5. | --- | --- |
  6. | -S | 创建会话窗口 |
  7. | -A | 所有的窗口都调整为当前终端的大小 |
  8. | -d | 断开screen进程(得有用户是Attached状态,可以用screen -list查看) |
  9. | -ls | 同于-list,显示目前所有的screen |
  10. | -r | 恢复离线的screen进程,可以指定多个pid.tty.host |
  11. | -x | 恢复离线的screen作业 |
  12. | -wipe | 检查目前所有的screen作业,并删除已经无法使用的screen作业 |
  13. 【实际操作案例】
  14. ```shell
  15. 1.进入一个新的screen会话,名字叫做s1
  16. [root@chaogelinux ~]# screen -S s1
  17. 2.此时会立刻进入screen,检查会话信息
  18. [root@chaogelinux ~]# screen -ls
  19. There is a screen on:
  20. 27686.s1 (Attached)
  21. 1 Socket in /var/run/screen/S-root.
  22. 3.想要退出screen会话,直接输入exit
  23. [root@chaogelinux ~]# screen -S s1
  24. [screen is terminating]

screen实际应用,模拟突然端口远程会话

  1. 1.新建一个会话,执行一个持续执行的任务
  2. [root@chaogelinux ~]# screen -S myPing
  3. 2.执行一个ping任务
  4. ping baidu.com
  5. 3.直接关闭窗口
  6. 4.检查screen会话
  7. 发现有个myPing是挂掉的状态
  8. [root@chaogelinux ~]# screen -ls
  9. There is a screen on:
  10. 28570.myPing (Detached)
  11. 1 Socket in /var/run/screen/S-root.
  12. 5.恢复会话
  13. [root@chaogelinux ~]# screen -r myPing
  14. 6.退出会话直接exit
  15. 7.还可以再次尝试用screen新建一个会话,使用vim编辑文件,然后关闭窗口

会话共享

screen命令不仅可以保护用户在极端的情况下不会丢失对系统的远程控制,还可以进行会话共享,分屏切割,会话锁定等功能。
例如会话共享,可以让多个用户看到一样的内容
【利用screen完成远程协助功能】

  1. 1.小王同学创建一个screen会话,等待超哥连接
  2. screen -S shareScreen
  3. 2.超哥登录服务器,查看以存在的会话信息
  4. [root@chaogelinux ~]# screen -ls
  5. 3.超哥加入会话,且开始操作,协助小王解决问题,小王坐在电脑前默默观看
  6. screen -x shareScreen
  7. 4.小王默默观看超哥一顿输出,解决bug
  8. 5.超哥退出screen输入ctrl + a + d 组合键,留下小王满意的笑容
  9. ctrl + a + d #超哥退出screen
  10. 6.小王退出screen,正常操作linux
  11. exit