往日微忆
文章目录

最近把网站VPS从Vultr迁移到了Linode,重新建站,重新布局,加上浏览过小z博客的博文(https://www.xiaoz.me/archives/8223),受益匪浅,深受启发,顺便把Linode VPS上Debian登录安全配置了下,适用于所有Linux远程主机。

一、更改远程主机root密码

部分VPS预设了root密码,如Vultr,没规律,太难记,安全起见,更改预设密码,先ssh登录root用户,再运行命令:passwd 。

二、禁用root登录

root用户权限太大,一旦泄漏,不堪设想,尽量不用root用户ssh登录,操作步骤如下:

(一)建立新用户

假设建立用户lily,终端执行如下命令即可:

  1. useradd -s /bin/bash -d /home/lily -m lily

设置密码:

  1. passwd lily

(二)修改配置文件

打开  /etc/ssh/sshd_config 文件,将其中 PermitRootLogin yes 改为PermitRootLogin no ,再重启ssh服务(各发行版本重启命令可能有出入,我这里用的是Debian )

  1. /etc/init.d/ssh restart

修改配置文件需要root用户才能执行,完成之后root用户将不能登录,使用普通用户 lily 登录即可。

三、修改SSH端口

默认ssh端口为22,打开 /etc/ssh/sshd_config 文件,找到#Port 22 这一行,将#号去掉,并将22修改为您想设置的端口号,如2022,最后保存退出。另外请不要随意将端口号透漏给别人。最后输重启SSH服务即可。再下一次登录的时候就需要使用您修改的端口进行登录了,ssh连接命令得要加上端口号,命令如下:

  1. ssh -p 2022 user@ip      #2022为端口号,user为用户名   ip为要登陆的ip

四、使用密钥登录

生成 rsa 密钥对,私钥放本地机,公钥放远程服务器,使用密钥登录,免输入远程用户密码,没有私钥将不能登录远程服务器。

(一)生成密钥对

在本机或服务器上(在哪儿都无所谓,主要目的是生成密钥对,是哪个用户运行命令也无所谓,此处演示是用用户lily)使用命令 ssh-keygen -t rsa 生成 rsa 密钥对,会生成一个私钥和一个公钥,在提示输入 passphrase(密钥短句)时如果不输入,直接回车,那么以后你登录服务器就不会验证密码,否则会要求你输入passphrase,注意这是私钥的密码,不是远程服务器登录的密码。默认会将私钥放在/home/lily/.ssh/id_rsa,公钥放在/home/lily/.ssh/id_rsa.pub。

如果本地只登录一台远程服务器,运行以上  ssh-keygen -t rsa  命令即可,ssh 远程登录时会默认使用私钥id_rsa。如果要登录多台远程服务器,则需要稍作配置,示例要登录两台远程VPS服务器 A 和 B ,分别执行命令:

  1. ssh-keygen -t rsa -f idA_rsa -C “For A”
  2. ssh-keygen -t rsa -f idB_rsa -C “For B”

以上命令中 -f 指定文件名(自定,自己区分开就行)-C 备注生成的密钥(内容自定)。执行命令后,~/.ssh/ 目录下会生成两对 rsa 密钥:idA_rsa、idA_rsa.pub和idB_rsa、idB_rsa.pub。

(二)拷贝公钥至远程服务器

接上面示例,将对应公钥拷贝至远程服务器上的/home/lucy/.ssh/authorized_keys 文件,此处 lucy 为远程服务器中要登录的用户,视自己机器更改。注意,文件名一定要叫 authorized_keys (其实也可以改,在/etc/ssh/sshd_config里改,本人没试过)。如何拷贝对应公钥至远程服务器,有两种方法,假设拷贝公钥 idA_rsa.pub 至服务器A:

一是:首先将公钥 idA_rsa.pub 上传至服务器A用户目录.ssh/下,用 scp、ftp 或其它都可以上传,以下是 scp 命令:

  1. scp ~/.ssh/idA_rsa.pub lucy@A:~/.ssh/     #此处中的A可为服务器A的 IP 或者域名,如已经更改ssh端口,则要加上-p 端口,下同

然后在远程服务器A中运行以下命令:

  1. cat ~/.ssh/idA_rsa.pub >> ~/.ssh/authorized_keys

二是:直接在本地运行命令

  1. ssh-copy-id -i ~/.ssh/idA_rsa.pub lucy@A

ssh-copy-id 将公钥idA_rsa.pub填充到远程机器A相应用户目录上的authorized_keys文件中。

最后在远程服务器中就可以删除公钥文件 idA_rsa.pub 了。

(三)本地私钥管理

本地现有两个私钥idA_rsa和idB_rsa,但默认密钥登录远程服务器用的是id_rsa文件,只能密钥登录一台服务器,如要登录多台服务器,则ssh登录命令要加上-i指定私钥文件,示例:

  1. ssh -i ~/.ssh/idA_rsa lucy@A

如果嫌麻烦,可以配置SSH CONFIG,直接简易便登录,步骤如下:

首先新建一个自定义ssh config文件

  1. emacs ~/.ssh/config

粘贴如以下格式内容,保存:

  1. Host A                                              #这里是自定义的host简称,以后连接远程服务器就可以用命令ssh A)
  2.         User    lucy                               #这里填用户名(如:root)
  3.         HostName  A                           #这里填服务器地址 iP ,也可以是域名(如:server.xxoo.com)
  4.         Port 2022                                 #这里填服务器open-ssh端口(默认:22
  5.         IdentityFile   ~/.ssh/idA_rsa    #这里是刚刚生成的私钥文件地址(如~/.ssh/id_rsa)
  6. Host B                                               #这里是自定义的host简称,以后连接远程服务器就可以用命令ssh B)
  7.         User    lucyB                              #这里填用户名(如:root)
  8.         HostName  B                           #这里填服务器地址 iP ,也可以是域名(如:server.xxoo.com)
  9.         Port 2022                                 #这里填服务器open-ssh端口(默认:22
  10.         IdentityFile   ~/.ssh/idB_rsa    #这里是刚刚生成的私钥文件地址(如~/.ssh/id_rsa)

以上设置即时生效,即本地不用重启相关服务。

(四)修改文件权限

特别注意:安全起见,修改相关文件夹及文件权限,本地和远程服务器的 .ssh 目录权限设为700,.ssh 目录下的文件设为600,包含私钥文件、config文件、authorized_keys文件。否则,可能会出错。

(五)远程服务器上配置sshd_config

在远程服务器上打开 /etc/ssh/sshd_config 文件,修改其中参数:

  1. # 是否让 sshd 去检查用户家目录或相关档案的权限数据,这是为了担心使用者将某些重要档案的权限设错,可能会导致一些问题所致。例如使用者的 ~.ssh/ 权限设错时,某些特殊情况下会不许用户登入
  2. StrictModes no
  3. # 是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内
  4. RSAAuthentication yes
  5. PubkeyAuthentication yes
  6. AuthorizedKeysFile      %h/.ssh/authorized_keys
  7. #有了证书登录了,就禁用密码登录吧,安全要紧,这里建议留一手,先不要设为no,等所有设置成功,验证可以密钥登录服务器后,再设为no
  8. PasswordAuthentication no

修改成功重启ssh服务后,在本地即可使用密钥登录,终端直接输入 ssh A 即可访问远程服务器A ,如生成密钥对时设置了 passphrase ,则要输入 passphrase 。

如果出现“Too many authentication failures Authentication failed.“错误,在使用 ssh 命令时,加上”-o pubkeyAuthentication=no“参数。

 

参考文章: