SSH 操作实践指南

2023-05-16

本文最先发布在:https://www.itcoder.tech/posts/ssh-practice/

SSH 是我们经常要和远程服务器交互使用的工具。

下面是一些实践中总结的 SSH 操作经验:

一、 如何选择 SSH key 的加密算法?

从安全性和性能上综合考虑,我们建议:

  1. 如果 ssh 支持ed25519,则使用 ed25519
  2. 否则,建议使用 rsa, 位数选择4096

二、 如何生成 SSH key?

通过ssh-keygen工具生成 SSH key。

根据上面的建议,我们推荐你选第一个命令。

如果不支持ed25519,则使用第二个命令。

ssh-keygen -t ed25519 -C "user@example.com"

ssh-keygen -t rsa -b 4096 -C "user@example.com"

ssh-keygen -t ecdsa -b 521  -C "user@example.com"

ssh-keygen -t dsa  -C "user@example.com"

关于密钥密码(passphrase):

  1. 如果想要便利操作,不设置密钥密码,直接跳过。
  2. 如果想要更安全,建议设置密钥密码。

三、如何在本地电脑免密码使用 SSH

在上面创建 SSH key 的时候,如果设置了密码。

那么,以后每次在电脑上使用 SSH 论证的时候,都会提示你输入秘钥密码,非常麻烦。

如果本地电脑安全的话,建议让电脑系统保存 SSH 秘钥密码,避免频繁输入密码。

~/.ssh目录下创建config文件,内容如下:

Host *
    UseKeychain yes
    AddKeysToAgent yes

四、拷贝 SSH 公钥到远程服务器

使用以下命令(ssh-copy-id)将 ssh 公钥 拷贝到远程服务器。

以后就可以通过 ssh 公钥密钥来认证登录远程服务器了。

 ssh-copy-id -i ~/.ssh/id_ed25519.pub root@127.0.0.1

 ssh-copy-id -i ~/.ssh/id_rsa.pub root@127.0.0.1

 ssh-copy-id -i ~/.ssh/id_ecdsa.pub root@127.0.0.1

 ssh-copy-id -i ~/.ssh/id_dsa.pub root@127.0.0.1

请根据 SSH key 加密算法类型,具体选择其中一条命令。 其中, root@127.0.0.1是远程服务器的公网 IP 地址和登录用户名,请根据实际情况修改。

这条命令的作用就是: 将本地 SSH 客户端的公钥,拷贝到远程服务器的~/.ssh/authorized_keys 文件中。

五、修改 SSH 的默认端口

SSH 的默认端口 22,很容易被攻击。

建议将该端口修改为0~65535的非常规端口,比如:3576

编辑 SSH 服务端配置文件:

Port 3576

保存退出。

如果服务器启用了 SELinux,则还需进行额外配置。

首先,确认 SELinux 是否启用:

sestatus 2> /dev/null | grep -E -q 'SELinux status:\s+enabled' && echo yes || echo no

输出 yes 即表示启用了 SELinux,那么就需要再对 SELinux 进行配置:

semanage port -a -t ssh_port_t -p tcp 3576

请注意把 3576 替换为实际配置的端口。

如果服务器启用了防火墙firewalld,则还需进行额外配置。

首先,确认 firewalld 是否启用:

systemctl status firewalld 

输出日志中含有Active: active (running)字样,那么还需要对firewalld进行配置:

firewall-cmd --permanent --zone=public --add-port=3576/tcp
firewall-cmd --reload

(后面对于 SSH 服务端配置文件的修改,最好也需要测试,并重启一下 sshd,保证修改生效。)

测试一下,设置是否正确:

sshd -t
WARNING: 'UsePAM no' is not supported in Fedora and may cause several problems.

根据提示修正错误和警告,直到测试通过。

重启 sshd 服务

systemctl restart sshd

六、启用 RSA验证,公钥验证

    RSAAuthentication yes   #是否允许RSA验证
    PubkeyAuthentication yes   #是否允许公钥验证
    AuthorizedKeysFile .ssh/authorized_keys  #公钥文件存放的位置

七、禁止密码安全验证

    ChallengeResponseAuthentication no   #设置是否允许使用提示应答式认证。sshd支持login.conf文件中定义的所有认证类型
    PasswordAuthentication no   #设置是否需要口令验证,默认为yes
    PermitEmptyPasswords no   #设置是否允许用空口令登录
    UsePAM yes   #是否启用PAM插件式认证模块,默认为yes 

注:在 RHEL 系列(RHEL,Fedora,CentOS 等)中不允许设置 UsePAM no,否则可能出现下面的警告和问题。

WARNING: 'UsePAM no' is not supported in Fedora and may cause several problems.

八、允许/禁止 Root 用户通过 SSH 登录系统

根据实际情况来设置是否允许 root 用户通过 SSH 登录系统。

    PermitRootLogin yes   #如果为yes则允许root用户使用ssh登录,为no则表示不允许root进行ssh登录,为without-password则表示禁止 root 账户通过密码登入,但仍可以通过公私钥对登入。

九、限制通过 SSH 方式的用户登录

9.1 只允许指定用户进行登录(白名单):

AllowUsers    aliyun test@192.168.1.1   # 允许 aliyun 和从 192.168.1.1 登录的 test 帐户通过 SSH 登录系统。

9.2 只拒绝指定用户进行登录(黑名单):

DenyUsers    d4rksec aliyun    #Linux系统账户   # 拒绝 d4rksec、aliyun 帐户通过 SSH 登录系统

 

十、 其他优化和安全配置

    LoginGraceTime 120   #设置如果用户不能成功登录,sshd将会在这个配置参数指定的时间过后断开连接(单位为秒)
    MaxAuthTries 6  #指定每个连接最大允许的认证次数。默认值是6.如果失败认证的次数超过这个数值的一半,连接将被强制断开。且会生成额外的失败日志消息。
    MaxSessions 10  #指定每个网络连接允许打开会话的最大数目。默认值为10
    StrictModes yes   #设置sshd在接受登录请求前是否检查用户的主目录以及rhosts文件的权限和所有者等信息。防止目录和文件设成任何人都有写权限

以上配置编辑SSHD 配置文件,/etc/ssh/sshd_config

十一、限制来自指定 IP 通过SSH 方式的用户登录

11.1 允许指定 IP 或者 IP 范围的用户进行登录(白名单):

编辑配置文件:

vi /etc/hosts.allow
sshd:192.168.0.1:allow  #允许 192.168.0.1 这个 IP 地址 ssh 登录
sshd:192.168.0.1/24:allow #允许 192.168.0.1/24 这段 IP 地址的用户登录
sshd:ALL # 允许全部的 ssh 登录 

11.2 禁止指定 IP 或者 IP 范围的用户进行登录(黑名单):

编辑配置文件:

vi /etc/hosts.deny
sshd:192.168.0.1:deny  #禁止 192.168.0.1 这个 IP 地址 ssh 登录
sshd:192.168.0.1/24:deny #禁止 192.168.0.1/24 这段 IP 地址的用户登录
sshd:ALL # 禁止全部的 ssh 登录 

注:同时设置上述两个文件时,hosts.allow文件中规则的优先级更高。

十二、 通过Fail2Ban 和 iptables 配置,防止服务器被恶意扫描

本文不展开,请阅读下面的参考文档,进一步了解相关内容。

十三、参考文档

  1. 選擇 SSH key 的加密演算法
  2. Linux 中提高的 SSH 的安全性
  3. SSH 安全加固的一些措施
  4. SSH 安全加固
  5. 安全运维那些事之SSH
  6. ssh安全加固
  7. SSH登陆失败的日志查看与攻击预防
  8. CentOS7下安装和使用Fail2ban
  9. Linux实例如何限制指定用户或IP地址通过SSH登录
  10. Top 20 OpenSSH Server Best Security Practices
  11. fail2ban的使用以及防暴力破解与邮件预警
  12. Fail2Ban 高级配置 保护 Nginx 服务



如果你有任何疑问,请通过以下方式联系我们:

微信:

微信群: 加上面的微信,备注微信群

QQ: 3217680847

QQ 群: 82695646雪梦科技交流群

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSH 操作实践指南 的相关文章

  • 在 Python 中使用 Paramiko 模块切换到 root 用户时出现“必须从终端运行”

    我正在尝试通过 Python 脚本自动执行任务 这个想法是以普通用户身份登录 然后发送su命令并切换到 root 帐户 我无法直接以 root 身份登录的原因是SSHD不允许 root 登录 这是我所拥有的 ip 192 168 105 8
  • Windows 7 上的 VirtualBox 端口转发不起作用

    Windows 7 上的 VirtualBox 端口转发不起作用 我尝试通过端口转发从我的 Windows 7 主机 ssh 到我的 VirtualBox 但 VirtualBox 不会打开端口进行侦听 我可以通过打开 VirtualBox
  • git clone 永远挂在 github 上

    当我按照 github 中的第 5 点 测试所有内容 时guide http help github com linux set up git ssh 命令也永远挂起 根据该指南 我应该看到一条消息 Github 不提供 shell 访问
  • 有没有办法使用 Paramiko 和 Python 来获取您连接的 SSH 服务器的横幅?

    有没有办法使用 Paramiko 和 Python 来获取您尝试连接的 SSH 服务器的横幅 我正在处理许多机器的超安全服务器设置过程 密码是通过预定义的密钥生成的 该密钥与 SSH 横幅一起打印出来 我可以访问将为我提供密码的实用程序 但
  • 调试神秘的git+ssh+proxy失败“bash:没有这样的文件或目录”的艰难方法

    我正在尝试通过 SOCKS5 代理克隆 github 存储库 在 ssh config I have Host github com github com ProxyCommand usr bin nc X 5 x 127 0 0 1 70
  • 通过私钥使用 Python 进行 SSH

    在我的脚本中 我需要使用私钥通过 SSH 连接到远程系统 并将文件转储到其目录中 我用来 SSH 进入系统的命令是这样的 ssh i private key localhost 接下来是标准输入 输入密钥 private key 的密码 我
  • Capistrano 和 GitHub Private Repo – 权限被拒绝(公钥)

    我继承了一个托管在 Linode 上的 Rails 项目 之前的开发人员使用 BitBucket 存储库以及 Capistrano 进行部署 我已经在 GitHub 上设置了一个私人存储库 并且正在尝试让 Capistrano 配方发挥作用
  • 无法验证主机真实性

    我第一次做git pull 在git中提示无法确定主机的真实性 与我生成的私钥相比 RSA密钥指纹不正确 我只是想知道如何更新它以便它读取正确的文件以及为什么它首先读取错误的指纹 我遇到了类似的问题 这意味着远程主机未知 不受信任 修复方法
  • 流浪家园慢

    我有一个基于 Laravel Homestead 的 vagrant 服务器 用于在本地测试我的 Laravel 站点 大部分情况下它运行得很好 然而 最近 我遇到了问题 它会停止几分钟 典型 到几个小时 罕见 这种情况每 15 分钟左右就
  • 尝试 SSH 时设备的 ioctl 不合适

    我正在尝试通过 SSH 连接几台服务器并尝试获取sudo l每个服务器的输出 下面是我正在执行的脚本 bin bash serverlist tmp servers while IFS read r server netgroup user
  • 通过 SFTP 克隆 Git 存储库

    每次我尝试克隆 Git 存储库时都会遇到致命错误 我运行这个 git clone sftp email protected cdn cgi l email protection git foobar git 我得到这个 fatal Unab
  • PHP shell_exec 使用 ssh 运行 shell 脚本

    我有一个 shell 脚本 使用 ssh 和密钥连接到另一台机器 因此它不需要用户名和密码 当我从命令行运行这个脚本时 它工作正常 但是当我从 php shell exec 运行这个脚本时 它不起作用 如果我与 PHP 建立 ssh 连接并
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • Paramiko ValueError“p 的长度必须恰好为 1024、2048 或 3072 位”

    我正在尝试使用 Python 脚本连接 SFTP 由于 p 错误 我无法连接 import paramiko client paramiko SSHClient client load system host keys client con
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • GoLang ssh:尽管将其设置为 nil,但仍出现“必须指定 HosKeyCallback”错误

    我正在尝试使用 GoLang 连接到远程服务器 在客户端配置中 除了用户和密码之外 我将 HostKeyCallback 设置为 nil 以便它接受每个主机 config ssh ClientConfig User user HostKey
  • Composer 用于下载私有 GitHub 存储库

    我无法使用 Composer 下载 github 私人存储库 php composer phar update 我收到以下错误 The https api github com repos company private1 https ap
  • 我可以在本地使用 RSA 密钥测试身份验证吗?

    有没有办法在本地检查您是否为 RSA 密钥提供了正确的密码 最近 我在将一些提交推送到 github 时遇到了麻烦 因为推送提示输入密码 然后身份验证失败 我验证了 github 具有正确的公钥id rsa文件在我的 ssh目录 并且我验证
  • ssh远程变量赋值?

    以下内容对我不起作用 ssh email protected cdn cgi l email protection k 5 echo k 它只是返回一个空行 如何在远程会话 ssh 上分配变量 Note 我的问题是not关于如何将本地变量传
  • Emacs + 流浪汉 + plink

    我正在尝试让 emacs trapmp 在 Windows XP 下运行 以便在 Amazon EC2 实例上通过 putty plink 工作 用于执行此操作的文档很少 我可以找到部分文档 但没有一个文档能够解决实现此功能所需的所有步骤

随机推荐

  • ubuntu下conda虚拟环境的操作,cuda,cudnn版本的查询, pytorch的安装

    一 ubuntu下conda虚拟环境的操作 随着深度学习的发展 xff0c tensorflow keras pytorch等深度学习框架的兴起和发展 xff0c 或者多用户的使用情况 xff0c 使得在ubuntu下我们可能需要安装多个深
  • dos 设置环境变量

    1 查看环境变量 echo path 2 设置环境变量 set path 61 path C your path
  • H264--2--语法及结构

    名词解释 场和帧 xff1a 视频的一场或一帧可用来产生一个编码图像 在电视中 xff0c 为减少大面积闪烁现象 xff0c 把一帧分成两个隔行的场 片 xff1a 每个图象中 xff0c 若干宏块被排列成片的形式 片分为I片 B片 P片和
  • 强化练习6:判断一字符串是否为回文,是返回1,不是返回0,出错返回-1

    题目 xff1a 判断一字符串是否为回文 xff0c 是返回1 xff0c 不是返回0 xff0c 出错返回 1 程序如下 xff1a include lt stdio h gt int fun char p if p 61 61 NULL
  • debian 服务器安装图形界面

    本人由于习惯了Ubuntu的图形界面 xff0c 实际上 呢 xff0c 是被Windows给带坏了 虽然全 控制台 很流弊 xff0c 但看着还是很不舒服 xff0c 所以就想着 安装 一个图形界面 其实很简单的说 xff0c 就是几行命
  • 如何在Ubuntu 20.04 上安装 Xrdp 服务器(远程桌面)

    本文最先发布在 xff1a https www itcoder tech posts how to install xrdp on ubuntu 20 04 Xrdp 是一个微软远程桌面协议 xff08 RDP xff09 的开源实现 xf
  • 分布式事务最经典的七种解决方案

    随着业务的快速发展 业务复杂度越来越高 xff0c 几乎每个公司的系统都会从单体走向分布式 xff0c 特别是转向微服务架构 随之而来就必然遇到分布式事务这个难题 xff0c 这篇文章总结了分布式事务最经典的解决方案 xff0c 分享给大家
  • 如何在 Ubuntu 20.04 上安装 Ruby

    本文最先发布在 xff1a https www itcoder tech posts how to install ruby on ubuntu 20 04 Ruby 是当今最流行的语言之一 它有简洁的语法 xff0c 并且注重简单和生产力
  • 如何在 Ubuntu 20.04 上安装 Tomcat 9

    本文最先发布在 xff1a https www itcoder tech posts how to install tomcat 9 on ubuntu 20 04 这篇指南描述如何在 Ubuntu 20 04 上安装和配置 Tomcat
  • 如何在 Ubuntu 20.04 上安装 Yarn

    本文最先发布在 xff1a https www itcoder tech posts how to install yarn on ubuntu 20 04 Yarn 是一个 JavaScript 包管理器 xff0c 它兼容于 npm x
  • 如何在 Ubuntu 20.04 上安装和使用 Docker Compose

    本文最先发布在 xff1a https www itcoder tech posts how to install and use docker compose on ubuntu 20 04 Docker Compose 是一个命令行工具
  • 如何在 Ubuntu 20.04 上安装 VirtualBox

    本文最先发布在 xff1a https www itcoder tech posts how to install virtualbox on ubuntu 20 04 VirtualBox 是一个开源的 xff0c 跨平台的虚拟化软件 x
  • 如何在 Ubuntu 20.04 启用 SSH

    本文最先发布在 xff1a https www itcoder tech posts how to enable ssh on ubuntu 20 04 Secure Shell SSH 是一个网络协议 xff0c 它主要被用来加密客户端和
  • 如何在 Ubuntu 20.04 上安装 Vagrant

    本文最先发布在 xff1a https www itcoder tech posts how to install vagrant on ubuntu 20 04 Vagrant是一个命令行工具 xff0c 用于构建和管理虚拟开发环境 默认
  • 如何在 Ubuntu 20.04 上安装 GCC(build-essential)

    本文最先发布在 xff1a https www itcoder tech posts how to install gcc on ubuntu 20 04 GNU 编译器集合是一系列用于语言开发的编译器和库的集合 xff0c 包括 C C
  • 如何在 Ubuntu 20.04 上安装和配置 Redis

    本文最先发布在 xff1a https www itcoder tech posts how to install and configure redis on ubuntu 20 04 Redis 是一个开源的在内存存储键值对数据的存储程
  • 如何在 Ubuntu 20.04 上安装 PHP

    本文最先发布在 xff1a https www itcoder tech posts how to install php on ubuntu 20 04 PHP 是世界上使用广泛的服务端编程语言之一 很多著名的 CMS 和框架 xff0c
  • 用python轻松完成一个分布式事务TCC,保姆级教程

    什么是分布式事务 xff1f 银行跨行转账业务是一个典型分布式事务场景 xff0c 假设A需要跨行转账给B xff0c 那么就涉及两个银行的数据 xff0c 无法通过一个数据库的本地事务保证转账的ACID xff0c 只能够通过分布式事务来
  • 如何在 Ubuntu 20.04 上安装 Spotify

    本文最先发布在 xff1a https www itcoder tech posts how to install spotify on ubuntu 20 04 Spotify是一个音乐流媒体服务商 xff0c 它可以让你和无数的歌曲亲密
  • SSH 操作实践指南

    本文最先发布在 xff1a https www itcoder tech posts ssh practice SSH 是我们经常要和远程服务器交互使用的工具 下面是一些实践中总结的 SSH 操作经验 xff1a 一 如何选择 SSH ke