阿里云、腾讯云等默认使用 root、22端口号、密码进行登录,这样很容易通过暴利破解密码。

本文在积累了大量安全Linux安全知识后,介绍如何修改默认端口号22、禁用root登录并增加普通用户来登录、摒弃密码登录并通过加密的密钥文件来登录,大大增强linux ssh登录的安全性。

 

本文实例的系统环境

阿里云 CentOS 7.4

 

一、修改SSH默认端口号22

米扑博客之前写过一篇博客:Linux 修改SSH 默认端口 22,防止被破解密码

1、修改配置文件

vim /etc/ssh/sshd_config

修改

#Port 22
#ListenAddress 0.0.0.0
#ListenAddress ::

Port 22
Port 23456
#ListenAddress 0.0.0.0
#ListenAddress ::

如上,取消注释 Port 22,并在其下方增加一行 Port 23456

这样通过 22 和 23456 两个端口号,都可以ssh登录linux服务器,以防止不可登录

 

2、使 sshd 配置生效

1)执行如下命令,使 sshd 配置修改后生效

systemctl restart sshd.service

 

2)生效后,使用新端口号登录

ssh root@47.106.126.167 -p 23456

# ssh root@47.106.126.167 -p 23456
root@47.106.126.167's password:

输入密码即可成功登录

注:此时 22 和 23456 两个端口都可以成功登录ssh

 

3)确认新端口可登录,注释掉22端口

vim /etc/ssh/sshd_config

注释掉端口22,最后的配置内容如下

#Port 22
Port 23456
#ListenAddress 0.0.0.0
#ListenAddress ::

最后,别忘了修改配置文件后,使其生效

systemctl restart sshd.service

 

二、增加普通用户,禁用root

1、增加普通用户 test

# useradd test
# passwd test
Changing password for user test.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

通过命令 useradd test,增加了普通用户名 test (可以修改为你自己喜欢的登录用户名)

通过命令 passwd test,为用户名 test 设置登录的密码

 

2、通过普通用户登录

使用新增加的用户名 test 及其密码登录linux服务器

ssh test@47.95.201.113 -p 23456

$ ssh test@47.95.201.113 -p 23456
test@47.95.201.113's password: 

Welcome to Alibaba Cloud Elastic Compute Service !

[test@mimvp-bj ~]$

 

3、普通用户添加到 sudoers

普通用户 test 切换到 root 超级用户,默认是不允许的,会报错如下:

$ sudo -s

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] password for test:
test is not in the sudoers file.  This incident will be reported.

因此,根据错误提示,需要把普通用户 test 添加到 sudoers 文件里

 

米扑博客之前介绍了相关配置的博客:Linux sudo 免密码输入 和 Linux ssh 切换登录用户自动转到root用户

下面直接给出详细的配置步骤:

1)修改文件权限,拥有编辑文件写的权限

chmod u+w /etc/sudoers

2)编辑文件 /etc/sudoers

vim /etc/sudoers

在root ALL=(ALL) ALL 下添加一行 test ALL=(ALL) NOPASSWD:ALL

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

test ALL=(ALL) NOPASSWD:ALL  # test为你的用户名

3)改回sudoers文件的原权限

chmod u-w /etc/sudoers

 

4、普通用户登录后自动切换到root超级用户

1)用户用户登录后,修改配置文件

ssh test@47.95.201.113 -p 23456

$ ssh test@47.95.201.113 -p 23456
test@47.95.201.113's password: 
Last login: Sat Oct 13 22:12:42 2018 from 106.39.151.17

Welcome to Alibaba Cloud Elastic Compute Service !

普通用户登录后,修改当前用户(test)目录下的 .bash_profile 文件

vim /home/test/.bash_profile

在该配置文件中修改两处:

a)添加一行

sudo su root

b)修改一行

PATH=$PATH:$HOME/.local/bin:$HOME/bin

PATH=$PATH:$HOME/bin

修改后的 /home/test/.bash_profile 配置文件:

# /home/test/.bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
sudo su root

# User specific environment and startup programs

#PATH=$PATH:$HOME/.local/bin:$HOME/bin
PATH=$PATH:$HOME/bin

export PATH

使用 SecureCRT连接工具,不用重启,重新登录,即可切换到了 root (米扑验证成功

若本机需要生效,需要重启服务器,使修改生效

 

配置test和root登录文件

#####  1. 修改 /etc/profile,新增最后三行 #####

alias ll='ls -al --color=auto'

echo "/etc/profile +++ whoami 111 =" `whoami`


#####  2. 修改 /etc/bashrc,新增最后三行 #####
if [ `whoami` == 'root' ]; then
    echo ""
fi
echo "/etc/bashrc +++ whoami 111 =" `whoami`


#####  3. 修改 /home/test/.bash_profile,新增最后三行 #####
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH


#source /etc/profile 

echo "test /home/test/.bash_profile +++ whoami 111 =" `whoami`
echo "test /home/test/.bash_profile +++ sudo su root"
sudo su root


#####  4. 修改 /root/.bash_profile, 新增两行  #####
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi


echo "root /root/.bash_profile +++ whoami 111 =" `whoami`
echo ""

# User specific environment and startup programs


#####  5. 修改 /home/test/.bashrc,新增最后一行  #####
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

echo "test /home/test/.bashrc +++ whoami 111 =" `whoami`


#####  6. 修改 /root/.bashrc,新增最后一行  #####
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi


echo "root /root/.bashrc +++ whoami 111 =" `whoami`



2)验证普通用户登录自动切换到root

首先,普通用户先退出登录

然后,普通用户再次登录

ssh test@47.95.201.113 -p 23456

$ ssh test@47.95.201.113 -p 23456
test@47.95.201.113's password: 
Last login: Sat Oct 13 22:40:12 2018 from 106.39.151.17

Welcome to Alibaba Cloud Elastic Compute Service !

[root@mimvp-bj test]# 

上面登录记录,可以看到最后一行自动切换到了 root ([root@mimvp-bj test]#)

 

3)禁用 root 登录

在上面的步骤2)中,确认通过普通用户 test 可以自动切换到 root 超级用户后,就可以禁用 root 登录了

a)修改配置文件

vim /etc/ssh/sshd_config

b)找到 "PermitRootLogin" 关键字,修改

PermitRootLogin yes

PermitRootLogin no

修改后的配置文件(片段)可以为:

UseDNS no
AddressFamily inet
#PermitRootLogin yes
PermitRootLogin no 

c)使修改配置后生效

systemctl restart sshd.service

d)验证 root 已经禁用,无法登录

$ ssh root@47.95.201.113 -p 23456
root@47.95.201.113's password:
Permission denied, please try again.

 

 

三、加密密钥代替密码登录

通过 openssl ssh-keygen来生成 rsa 私钥和公钥来进行授权登录

1、普通用户 test 登录到 linux 服务器,并切回普通用户

ssh test@47.95.201.113 -p 23456

$ ssh test@47.95.201.113 -p 23456
test@47.95.201.113's password: 
Last login: Sun Oct 14 00:01:49 2018 from 106.39.151.17

Welcome to Alibaba Cloud Elastic Compute Service !

[root@mimvp-bj test]# exit
[test@mimvp-bj ~]$

经过上文,普通用户 test 用户登录后,默认会切换到root超级用户

因为我们已经禁用了root登录,并要用普通用户 test 登录,因此需切换到普通用户 test (Ctrl + D

 

2、确认已安装 openssl

[test@mimvp-bj ~]$ openssl -V

若返回一大推字符串算法,表示已安装 openssl

若提示找不到,则需要安装 openssl

yum install openssl -y

 

3、生成rsa密钥文件

进入普通用户的当前目录下

cd ~

执行命令 ssh-keygen

根据提示,输入生成rsa的密码(使用密钥文件时需输入的密钥,增强安全性)

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa): 
Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase):     # 设置密钥文件的密码
Enter same passphrase again:    # 重复一次设置密钥文件的密码
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:9PH7wK+eReWcuIfm0fTbyswGdqctos3PlrY+w9d0RAg test@mimvp-bj
The key's randomart image is:
+---[RSA 2048]----+
|            E. . |
|              . .|
|        . .    ..|
|       . . o  .+o|
|        S . ...+o|
|           .oo* =|
|           .+O.O+|
|           o+@& *|
|          .o*X%O.|
+----[SHA256]-----+

 

4、配置服务器公钥

生成rsa密匙对后,在服务器上面配置一下才能使用:

a)进入 ~/.ssh

cd ~/.ssh/

b)查看rsa密钥文件

$ ls
id_rsa  id_rsa.pub

c)把公钥文件授权

cp id_rsa.pub authorized_keys

再查看当前文件

$ ls -a
.  ..  authorized_keys  id_rsa  id_rsa.pub

d)授权密钥文件和目录

chmod 600 authorized_keys
chmod 700 ~/.ssh

# 然后修改密匙文件的权限,避免被其他用户修改/删除。
# chmod 600 - 只有属主有读写权限。
# chmod 700 - 只有属主有读、写、执行权限。

查看文件的权限

$ ls -l authorized_keys
-
rw------- 1 test test 397 Oct 14 00:35 authorized_keys
$ ls -al ~
d
rwx------  2 test test 4096 Oct 14 00:35 .ssh

 

5、配置SSH使用密钥登录

sudo vim /etc/ssh/sshd_config 

找到关键字"PubkeyAuthentication",取消注释

#PubkeyAuthentication yes
PubkeyAuthentication yes 

说明:经测试,取不取消注释默认都支持私钥登录,若禁用密钥登录需改成 PubkeyAuthentication no

使配置文件生效

sudo systemctl restart sshd

到此,服务器端配置完成。

 

6、客户端配置,并通过密钥文件连接登录服务器端

a)从服务器上,下载私钥文件到本地

sz ~/.ssh/id_rsa

 

b)SSH命令行通过私密文件登录服务器

sudo ssh -i id_rsa test@47.95.201.113 -p 23456

$ sudo ssh -i id_rsa test@47.95.201.113 -p 23456
Enter passphrase for key 'id_rsa': 
Last login: Sun Oct 14 00:51:29 2018 from 106.39.151.17

Welcome to Alibaba Cloud Elastic Compute Service !

[root@mimvp-bj test]#

如上,提示输入密钥文件的密钥,即步骤 3、生成rsa密钥文件时输入的密码,成功登录

 

说明:若不想使用rsa密钥文件时输入密码,可以取消私钥密码,步骤如下:

首先,使用openssl命令去掉私钥的密码

openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_new

# openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_nopassword
Enter pass phrase for id_rsa :   # 输入私钥文件的密码
writing RSA key

接着,修改私钥文件的权限

chmod 600 ~/.ssh/id_rsa

然后,通过无密码的私钥文件登录

ssh -i ~/.ssh/id_rsa_nopassword test@47.95.201.113 -p 23456  # 不需要输入私钥的密码

# ssh -i ~/.ssh/id_rsa_nopassword test@47.95.201.113 -p 23456
Last login: Sun Oct 14 09:08:51 2018 from 47.106.126.167

Welcome to Alibaba Cloud Elastic Compute Service !

此值,通过加密的密钥文件+密码无加密的密钥文件,都可以登录linux服务器

ssh -i ~/.ssh/id_rsa test@47.95.201.113 -p 23456  # 加密的密钥文件+密码

ssh -i ~/.ssh/id_rsa_nopassword test@47.95.201.113 -p 23456  # 不需要输入私钥的密码

 

c)SecureCRT 通过私密文件登录服务器

SSH2 —> Authentication选择"PublicKey"调到第一位后 —> 点击Properties...

不要使用全局公钥设置,选择右侧的只当前session适用,并导入私钥文件

然后,点击session登录,会自动弹出对话框,要求输入密钥文件的密码(与Shell命令登录时输入的一样)

至此,SecureCRT 通过私钥文件 + 私钥文件密钥登录linux服务器成功

 

这里,不要忘了,此时linux服务器有两种登录方式:

1)密码登录

2)密钥文件登录

若要禁用密码登录,修改配置文件

sudo vim /etc/ssh/sshd_config 

找到关键字"PasswordAuthentication",修改此行

PasswordAuthentication yes

PasswordAuthentication no

这里特别要注意:即使注释掉了此行,默认还是允许密码登录的

若要禁用密码登录则一定要明确显式的修改成 PasswordAuthentication no,没有其它方法,切记!

使配置文件生效

sudo systemctl restart sshd

到此,就禁用了密码(PasswordAuthentication)登录,只保留了密钥(PubkeyAuthentication)登录方式

 

 

四、多服务器共享一个密钥

当有很多linux服务器,但是不想单独给每个服务器生成一个个单独的密匙,那么你可以多个服务器共用一个密匙。

在一台linux服务器生成含密码的rsa密钥文件,然后把公匙 ~/.ssh/id_rsa.pub 拷贝到其他的多台linux服务器上,在普通用用户目录下新建 .ssh 目录

mkdir ~/.ssh

然后,把公匙(~/.ssh/authorized_keys)通过 rz/sz 或 ftp 或 wget 等方式上传到其他服务器

在服务器上面读取公匙文件内容(~/authorized_keys),写入到 ~/.ssh/authorized_keys

cat ~/authorized_keys | echo -e  > ~/.ssh/authorized_keys

接着,按照步骤三进行 SSH + 密钥文件 + 输入密钥文件密码 进行登录

 

 

五、总结

本文内容较多,主要是对linux登录做了多重安全性加强措施,确保服务器不被暴利破解。

1、修改了默认SSH端口22为随机端口号,如本文示例的23456端口号

2、禁用了root登录,新增加了普通用户(test)登录,可改成你自己喜欢的用户名

3、对普通用户,生成rsa密钥文件,并对密钥文件加密,通过加密的密钥文件来登录

4、禁用密码登录,只使用密钥文件 + 密钥文件密码登录,保管好密钥文件及其密码

 

经上步骤,几乎彻底禁用了 ssh root@ip -p 22 + 密码 这种传统登录方式

1、更改了默认端口22

2、禁用了用户名 root 登录

3、禁用了密码登录

4、改用成了 ssh -i id_rsa test@ip -p 23456 + 输入密钥文件密码 登录方式

随机端口号、禁用了root,禁用了密码,改用成普通用户+密钥文件,大大增强了服务器的安全性

 

 

参考推荐

Linux 修改SSH 默认端口 22,防止被破解密码

Linux ssh 切换登录用户自动转到root用户 (推荐)

Linux sudo 免密码输入

Mac 上启用 root 用户或更改 root 密码

Linux expect 命令无需输入密码登陆

Linux shell 脚本通过expect实现自动输入密码

Mac sudo: /etc/sudoers is owned by uid 501, should be 0

Linux之/etc/profile、~/.bash_profile等几个文件的执行过程

Linux 配置文件 /etc/profile 常见修改