linux下的openssh简介(centos 8)

打印 上一主题 下一主题

主题 1877|帖子 1877|积分 5631

1. 简介

OpenSSH 是一个开源的 SSH(Secure SHell)协议的实现,用于在不安全的网络中为网络服务提供安全的传输环境。OpenSSH 包罗服务器端和客户端工具,可用于远程登录、文件传输和其他安全网络服务。
openssh分为服务端openssh-server和客户端openssh-clients:


  • /etc/ssh/sshd_config是服务端文件
  • /etc/ssh/ssh_config是客户端文件
  • 服务端常用即sshd服务
  • 客户端常用即ssh、scp、sftp
2. 安装 OpenSSH

使用 dnf 安装 OpenSSH。
  1. sudo dnf install openssh-server openssh-clients
复制代码
3. 配置 OpenSSH 服务器

3.1 服务器配置文件

OpenSSH 服务器的主要配置文件为 /etc/ssh/sshd_config。在举行任何修改后,需要重启 SSH 服务以使配置生效。
  1. sudo systemctl restart sshd
复制代码
配置文件的详解

  1. #Port 22                  # 默认SSH监听端口为22
  2. #AddressFamily any        # 指定SSH监听的地址族,any表示同时监听IPv4和IPv6
  3. #ListenAddress 0.0.0.0    # 指定监听的IPv4地址,0.0.0.0表示监听所有地址
  4. #ListenAddress ::         # 指定监听的IPv6地址,::表示监听所有地址
  5. HostKey /etc/ssh/ssh_host_rsa_key  # 指定RSA密钥文件路径
  6. HostKey /etc/ssh/ssh_host_ecdsa_key  # 指定ECDSA密钥文件路径
  7. HostKey /etc/ssh/ssh_host_ed25519_key  # 指定ED25519密钥文件路径
  8. # Ciphers and keying
  9. #RekeyLimit default none  # 指定重新生成密钥的数据量限制,default表示使用默认值
  10. # Logging
  11. #SyslogFacility AUTH      # 指定日志记录的设施,AUTH表示使用auth设施
  12. SyslogFacility AUTHPRIV   # 指定日志记录的设施,AUTHPRIV表示使用authpriv设施
  13. #LogLevel INFO            # 指定日志级别,INFO表示记录信息级别的日志
  14. # Authentication:
  15. #LoginGraceTime 2m        # 设置登录超时时间为2分钟
  16. PermitRootLogin yes       # 允许root用户通过SSH登录
  17. #StrictModes yes          # 检查用户目录和密钥文件的权限
  18. #MaxAuthTries 6           # 设置最大认证尝试次数为6
  19. #MaxSessions 10           # 设置最大会话数为10
  20. #PubkeyAuthentication yes  # 允许使用公钥认证
  21. AuthorizedKeysFile      .ssh/authorized_keys  # 指定授权密钥文件的位置
  22. #AuthorizedPrincipalsFile none  # 指定授权主体文件的位置,none表示不使用
  23. #AuthorizedKeysCommand none  # 指定外部命令用于验证密钥,none表示不使用
  24. #AuthorizedKeysCommandUser nobody  # 指定执行AuthorizedKeysCommand的用户
  25. #HostbasedAuthentication no  # 禁止基于主机的认证
  26. #IgnoreUserKnownHosts no  # 不忽略用户known_hosts文件
  27. # Don't read the user's ~/.rhosts and ~/.shosts files
  28. #IgnoreRhosts yes  # 忽略rhosts文件
  29. # To disable tunneled clear text passwords, change to no here!
  30. #PasswordAuthentication yes  # 允许密码认证
  31. #PermitEmptyPasswords no  # 不允许空密码
  32. PasswordAuthentication yes  # 允许密码认证
  33. # Change to no to disable s/key passwords
  34. #ChallengeResponseAuthentication yes  # 允许s/key密码认证
  35. ChallengeResponseAuthentication no  # 禁止s/key密码认证
  36. # Kerberos options
  37. #KerberosAuthentication no  # 禁止Kerberos认证
  38. #KerberosOrLocalPasswd yes  # 允许Kerberos或本地密码认证
  39. #KerberosTicketCleanup yes  # 清理Kerberos票据
  40. #KerberosGetAFSToken no  # 不获取AFS令牌
  41. #KerberosUseKuserok yes  # 使用Kerberos用户ok文件
  42. # GSSAPI options
  43. GSSAPIAuthentication yes  # 允许GSSAPI认证
  44. GSSAPICleanupCredentials no  # 不在会话结束时清理GSSAPI凭据
  45. #GSSAPIStrictAcceptorCheck yes  # 对GSSAPI接受者进行严格检查
  46. #GSSAPIKeyExchange no  # 禁止GSSAPI密钥交换
  47. #GSSAPIEnablek5users no  # 不启用k5users
  48. UsePAM yes  # 使用PAM进行认证
  49. #AllowAgentForwarding yes  # 允许SSH代理转发
  50. #AllowTcpForwarding yes  # 允许TCP转发
  51. #GatewayPorts no  # 网关端口,no表示仅监听环回接口
  52. X11Forwarding yes  # 允许X11转发
  53. #X11DisplayOffset 10  # 设置X11显示偏移量
  54. #X11UseLocalhost yes  # 使用localhost进行X11转发
  55. #PermitTTY yes  # 允许分配TTY
  56. PrintMotd no  # 不显示motd消息
  57. #PrintLastLog yes  # 显示上次登录信息
  58. #TCPKeepAlive yes  # 发送TCP保持活动包
  59. #PermitUserEnvironment no  # 不允许用户环境
  60. #Compression delayed  # 延迟压缩
  61. #ClientAliveInterval 0  # 设置客户端活动间隔
  62. #ClientAliveCountMax 3  # 设置客户端活动最大次数
  63. #UseDNS no
  64.   # 不使用DNS
  65. #PidFile /var/run/sshd.pid  # 指定PID文件路径
  66. #MaxStartups 10:30:100  # 最大启动数
  67. #PermitTunnel no  # 不允许隧道
  68. #ChrootDirectory none  # 不使用chroot目录
  69. #VersionAddendum none  # 不添加版本后缀
  70. #Banner none  # 不显示默认banner
  71. # Accept locale-related environment variables
  72. AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
  73. AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
  74. AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
  75. AcceptEnv XMODIFIERS  # 接受环境变量
  76. # override default of no subsystems
  77. Subsystem       sftp    /usr/libexec/openssh/sftp-server  # 指定sftp子系统
  78. # Example of overriding settings on a per-user basis
  79. #Match User anoncvs
  80. #       X11Forwarding no  # 对特定用户禁止X11转发
  81. #       AllowTcpForwarding no  # 对特定用户禁止TCP转发
  82. #       PermitTTY no  # 对特定用户禁止分配TTY
  83. #       ForceCommand cvs server  # 对特定用户强制命令
复制代码
实际上最常用的几个参数:
命令功能推荐值加快毗连速率UseDNS no
是否开启反向解析关闭GSSAPIAuthentication noGSS认证功能关闭安全优化选项Portssh端标语,被注释时默认为221~65535,推荐1w以上随机端口PermitRootLogin是否运行Root用户远程登陆,默认yes(ubuntu默认no)在安全场景最好更改为no,提前设置好sudo权限的普通用户ListenAddress监听的地址,允许哪些网段来ssh可修改,配合堡垒机等举行使用PasswordAuthentication yes是否允许密码验证,默认yes可修改,配合密钥登陆一同使用UsePAM yes是否使用PAM认证,默认yes需举行安全规划再选择是否关闭 3.2 安全操纵——修改 SSH 端口

出于安全考虑,可以将 SSH 服务器监听的端口更改为非尺度端口。编辑 /etc/ssh/sshd_config 文件,找到 Port 选项,修改为所需的端标语。
  1. Port 2222
复制代码
3.3 安全操纵——禁止 root 登录

为了增强安全性,建议禁止 root 用户通过 SSH 直接登录。编辑 /etc/ssh/sshd_config 文件,找到 PermitRootLogin 选项,修改为 no。
  1. PermitRootLogin no
复制代码
3.4 安全操纵——密钥认证

为了进步安全性,建议使用密钥认证方式登录 SSH。要注意,密钥认证仅单向有效(收到公钥的主机,可以被免密登录。在本场景,即A想要免密访问B,所以是A天生密钥并发送公钥到B),需要双向,需要双方都发送。


  • 文件

    • known_hosts:存放的是第一次ssh时的fingerprint(是否信任该主机)
      文件内容为:[免密登录服务器地址] [未知密钥头] [hostKey密钥]

    • authorized_keys:存放的是客户端发来的公钥文件
      文件内容为:[加密算法] [公钥内容] [用户@ip]

  • 原理

    • 在客户端服务器A上为自己创建一对密钥,并把公钥放在需要免密登录的服务器B上。
    • 当你要毗连到服务器B上时,客户端服务器A就会向服务器B哀求使用密钥举行安全验证。
    • 服务器B收到哀求之后,会在用户的home目录下寻找你的公钥。
    • 然后与你发送过来的公钥举行比力。
    • 如果两个密钥一致,服务器就用该公钥加密“质询”并把它发送给客户端服务器A。
    • 客户端收到“质询”之后用自己的私钥解密再把它发送给服务器。


  • 步调

  • 起首,在A天生 SSH 密钥对。
  1. #不需要再回车确认信息的命令
  2. ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
复制代码

  • 使用ssh-copy-id命令将公钥 ~/.ssh/id_rsa.pub 的内容复制到B的 ~/.ssh/authorized_keys 文件中。
  1. # 如果公钥在默认路径'~/.ssh'下,也可以不需要'-i'参数;
  2. ssh-copy-id -i .ssh/id_rsa.pub root@服务端ip
复制代码

  • 编辑 /etc/ssh/sshd_config 文件,确保以下选项已精确设置:
  1. PubkeyAuthentication yes
  2. AuthorizedKeysFile .ssh/authorized_keys
复制代码

  • (可选)如何更快的发放密钥


  • 使用sshpass命令直接输入密码
  1. yum install -y sshpass
  2. #sshpass -p 密码 ssh root@ip 执行的命令
  3. sshpass -p password ssh root@192.168.100.150 w
复制代码


  • sshpass可以配合ssh-copy-id
  1. #可能会遇到没有fingerprint,需要输入yes/no的情况,可以加-o StrictHostKeyChecking=no临时不检查主机信息
  2. sshpass -p password ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@192.168.100.150
复制代码
3.5 安全操纵——禁止密码认证

为了进一步进步安全性,可以禁止使用密码举行 SSH 登录。编辑 /etc/ssh/sshd_config 文件,找到 PasswordAuthentication 选项,修改为 no。
  1. PasswordAuthentication no
复制代码
4. 配置 OpenSSH 客户端

openssh-clients中的三个焦点功能


  • scp:远程传输文件
  • ssh:远程毗连
  • sftp:安全的ftp(22端口工作)
4.0 常用命令

4.0.1 ssh常用命令

  1. ssh -p 端口号 用户名@ip 执行的命令
  2. #-p 可选,指定端口号,默认22
  3. #执行的命令 可选,用于在ssh成功后直接执行的命令
  4. ssh -p12321 root@192.168.100.151 whoami
  5. root
复制代码
4.0.2 scp常用命令

  1. scp 文件/目录     用户名@ip:路径
  2. #-r 递归传输,传输目录
  3. #-p 保持属性信息不变
  4. #-P(大写) 指定端口号
  5. scp  -rp -P 22   /etc/hostname   root@192.168.100.149:/tmp/
复制代码
4.0.3 sftp常用命令

   一般都是工具提供的GUI
  4.1 客户端配置文件

OpenSSH 客户端的主要配置文件为 /etc/ssh/ssh_config。用户级别的配置文件为 ~/.ssh/config。
配置文件的详解

  1. # Host *
  2. #   ForwardAgent no          # 是否转发认证代理的连接
  3. #   ForwardX11 no            # 是否转发X11连接
  4. #   PasswordAuthentication yes  # 是否允许使用密码进行认证
  5. #   HostbasedAuthentication no  # 是否允许基于主机的认证
  6. #   GSSAPIAuthentication no   # 是否允许使用GSSAPI进行认证
  7. #   GSSAPIDelegateCredentials no  # 是否委派GSSAPI凭据
  8. #   GSSAPIKeyExchange no      # 是否使用GSSAPI密钥交换
  9. #   GSSAPITrustDNS no         # 是否信任DNS来解析GSSAPI主机名
  10. #   BatchMode no              # 是否以批处理模式运行,不提示用户输入
  11. #   CheckHostIP yes           # 是否检查主机IP地址
  12. #   AddressFamily any         # 指定地址族,any表示同时使用IPv4和IPv6
  13. #   ConnectTimeout 0          # 连接超时时间,0表示不超时
  14. #   StrictHostKeyChecking ask # 是否严格检查主机密钥,ask表示询问用户
  15. #   IdentityFile ~/.ssh/id_rsa  # 指定RSA密钥文件路径
  16. #   IdentityFile ~/.ssh/id_dsa  # 指定DSA密钥文件路径
  17. #   IdentityFile ~/.ssh/id_ecdsa  # 指定ECDSA密钥文件路径
  18. #   IdentityFile ~/.ssh/id_ed25519  # 指定ED25519密钥文件路径
  19. #   Port 22                   # 指定默认的SSH端口
  20. #   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc  # 指定允许的加密算法
  21. #   MACs hmac-md5,hmac-sha1,umac-64@openssh.com  # 指定允许的MAC算法
  22. #   EscapeChar ~              # 指定转义字符
  23. #   Tunnel no                 # 是否创建隧道
  24. #   TunnelDevice any:any      # 指定隧道设备
  25. #   PermitLocalCommand no     # 是否允许执行本地命令
  26. #   VisualHostKey no          # 是否显示视觉主机密钥
  27. #   ProxyCommand ssh -q -W %h:%p gateway.example.com  # 指定代理命令
  28. #   RekeyLimit 1G 1h          # 指定重新生成密钥的数据量和时间限制
  29. # This system is following system-wide crypto policy.
  30. # To modify the system-wide ssh configuration, create a  *.conf  file under
  31. # /etc/ssh/ssh_config.d/  which will be automatically included below
  32. Include /etc/ssh/ssh_config.d/*.conf  # 包含/etc/ssh/ssh_config.d/目录下的所有.conf配置文件
复制代码


  • 配置数据的解析顺序
    命令行选项、用户特定文件、体系级文件。
    任何配置值只在第一次设置时被更改,因此主机特定的界说应该放在配置文件的开始,而默认值放在最后。
  • 实际上最常用的几个参数:
    ForwardAgent:控制是否转发认证署理的毗连。
    ForwardX11:控制是否转发 X11 毗连。
    PasswordAuthentication:控制是否允许使用密码举行认证。
    HostbasedAuthentication:控制是否允许基于主机的认证。
    GSSAPIAuthentication:控制是否允许使用 GSSAPI 举行认证。
    StrictHostKeyChecking:控制是否严酷检查主机密钥。
    IdentityFile:指定用于认证的密钥
4.2 使用 SSH 密钥登录

在客户端,使用以下命令登录 SSH 服务器:
  1. ssh 用户名@服务器地址 -p 端口号
复制代码
如果使用密钥认证,客户端会自动使用 ~/.ssh/id_rsa 私钥举行认证。
4.3 SSH 署理

为了简化使用 SSH 密钥的过程,可以使用 SSH 署理。运行以下命令以启动 SSH 署理:
  1. ssh-agent
复制代码
将天生的 SSH 密钥添加到署理中:
  1. ssh-add ~/.ssh/id_rsa
复制代码
5. 常见问题与办理方案

5.1 SSH 毗连被拒绝

检查服务器上的 SSH 服务是否正在运行:
  1. sudo systemctl status sshd
复制代码
确保防火墙允许 SSH 端口的流量通过:
  1. sudo firewall-cmd --add-service=ssh --permanent
  2. sudo firewall-cmd --reload
复制代码
5.2 SSH 密钥认证失败

检查客户端和服务器上的 SSH 密钥文件权限是否精确。精确的权限设置如下:


  • ~/.ssh/id_rsa:600
  • ~/.ssh/authorized_keys:600
  • ~/.ssh:700
5.3 SSH 登录缓慢

检查客户端和服务器上的 DNS 解析是否正常。编辑 /etc/ssh/ssh_config 文件,添加以下行以禁用 DNS 解析:
  1. UseDNS no
复制代码
6. 密码分发脚本

6.1 脚本

  1. #!/bin/bash
  2. #author:tassel
  3. #desc: 一键创建密钥,并分发
  4. #0.import function lib
  5. . /etc/init.d/functions
  6. #1.variable
  7. passwd="Huawei@123"
  8. iplist="192.168.100.148 192.168.100.149 192.168.100.150"
  9. #2.create id_rsa
  10. if [ -f ~/.ssh/id_rsa ]; then
  11.         echo "已经创建密钥"
  12. else
  13.         echo "创建密钥ing"
  14.         ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' &>/dev/null
  15.         if [ $? -eq 0 ]; then
  16.                 action "密钥创建成功" /bin/true
  17.         else
  18.                 action "密钥创建失败" /bin/false
  19.         fi
  20. fi
  21. #3.copy-id
  22. for ip in $iplist
  23. do
  24.         sshpass -p $passwd ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@$ip &>/dev/null
  25.         if [ $? -eq 0 ]; then
  26.                 action "$ip 密钥分发成功" /bin/true
  27.         else
  28.                 action "$ip 密钥分发失败" /bin/false
  29.         fi
  30. done
复制代码
6.2 效果

  1. sh secretautosend.sh
  2. 创建密钥ing
  3. 密钥创建成功                                               [  OK  ]
  4. 192.168.100.148 密钥分发成功                               [  OK  ]
  5. 192.168.100.149 密钥分发成功                               [  OK  ]
  6. 192.168.100.150 密钥分发成功                               [  OK  ]
复制代码
6.3 ssh自动测试脚本与效果

  1. [root@manager ~]# cat sshtest.sh
  2. #!/bin/bash
  3. #author: tassel
  4. #desc: 自动测试ssh是否可以免密
  5. #0.import function lib
  6. . /etc/init.d/functions
  7. #1.test
  8. for ip in 192.168.100.{147..150}
  9. do
  10.         ssh $ip hostname &>/dev/null
  11.         if [ $? -eq 0 ]; then
  12.                 action "$ip测试成功" /bin/true
  13.         else
  14.                 action "$ip 测试失败,请检查" /bin/false
  15.         fi
  16. done
  17. ------
  18. [root@manager ~]# sh sshtest.sh
  19. 192.168.100.147 测试失败,请检查                           [FAILED]
  20. 192.168.100.148测试成功                                    [  OK  ]
  21. 192.168.100.149测试成功                                    [  OK  ]
  22. 192.168.100.150测试成功                                    [  OK  ]
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表