[TOC]

0x00 快速入门

SSH(Secure Shell,安全外壳协议)命令是openssh套件中的客户端连接工具,采用了非对称加密算法aymmetric encryption algorithm实现安全的远程登录服务器;

WeiyiGeek.ssh安全外壳协议

WeiyiGeek.ssh安全外壳协议


SCP(Secure Copy Protocol)Linux机器间的文件传递最简单最安全的方式scp命令


0x01 安全配置

ssh服务安装

1
2
3
4
5
6
7
8
# Debian 系
sudo apt-get update
sudo apt-get install -y openssh-server

# Redhat 系
sudo yum update
sudo yum install -y openssh-server
sudo dnf install -y openssh-server

服务启动/自启设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 方式1
systemctl enable/disable sshd # 自启启用或禁用
systemctl start sshd

# 方式2.
# chkconfig ssh on/off # 自启启用或禁用
# service ssh start
# /etc/init.d/ssh start

# kail-Deban自启服务
# update-rc.d ssh enable #开启自启
# update-rc.d ssh disabled #关闭自启

# 查看启动状态以及进程
systemctl status sshd
sudo ps -e | grep ssh


配置文件 /etc/ssh/sshd_config 说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#(1)基础配置
Port 20222 # SSH 预设使用 22 端口,建议更改默认的通信端口,例如20222
Protocol 2  # 选择的SSH协议版本2,如果要同时支持两者,就必须要使用 2,1 这个分隔
#ListenAddress 0.0.0.0   #监听的来自主机网卡的所有请求
ListenAddress 192.168.0.100 #只监听来自 192.168.0.100 这个 IP 的SSH联机,如果不使用设定的话,则预设所有接口均接受 SSH
PidFile /var/run/sshd.pid   #可以放置 SSHD 这个 PID 的档案!左列为默认值
LoginGraceTime 60 # 当使用者连上 SSH server 之后,会出现输入密码的画面在多久时间内没有成功连上 SSH server 就断线!时间为秒!
Compression yes       # 是否可以使用压缩指令

#(2)关于 version 1 的一些设定
KeyRegenerationInterval 3600     # 由前面联机的说明可以知道, version 1 会使用 server 的 Public Key ,那么如果这个 Public
                   # Key 被偷的话,岂不完蛋?所以需要每隔一段时间,来重新建立一次!这里的时间为秒!
ServerKeyBits 768           # Server key 的长度!


#(3)关于登录文件的讯息数据放置与 daemon 的名称
SyslogFacility AUTH # 当有人使用 SSH 登入系统的时候,SSH会记录资讯,这个信息要记录在什么 daemon name 底下?
#预设是以 AUTH 来设定的,即是 /var/log/secure 里面!
#Linux 基础其它可用的 daemon name 为:DAEMON,USER,AUTH, LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,
LogLevel INFO   # 登录记录的等级!任何讯息!

#(4)安全设定项目
# 4.1登入设定部分
PermitRootLogin no     # 是否允许 root 登入!预设是允许的,但是建议设定成 no!
UserLogin no        # 在 SSH 底下本来就不接受 login 这个程序的登入!
StrictModes yes      # 当使用者的 host key 改变之后,Server 就不接受联机,可以抵挡部分的木马程序!

#说明主机的 Private Key 放置的档案,预设使用下面的档案即可
HostKey /etc/ssh/ssh_host_key    # SSH version 1 使用的私钥
HostKey /etc/ssh/ssh_host_rsa_key  # SSH version 2 使用的 RSA 私钥
HostKey /etc/ssh/ssh_host_dsa_key  # SSH version 2 使用的 DSA 私钥


# 4.2 认证部分
RhostsAuthentication no  # 本机系统不止使用 .rhosts ,因为仅使用 .rhosts 太 不安全了,所以这里一定要设定为 no !
IgnoreRhosts yes      # 是否取消使用 ~/.ssh/.rhosts 来做为认证!当然是!
RhostsRSAAuthentication no # 这个选项是专门给 version 1 用的,使用 rhosts 档案在# /etc/hosts.equiv配合 RSA 演算方式来进行认证!不要使用
HostbasedAuthentication no # 这个项目与上面的项目类似,不过是给 version 2 使用的!
IgnoreUserKnownHosts no  # 是否忽略家目录内的 ~/.ssh/known_hosts 这个档案所记录主机内容?当然不要忽略,所以这里就是 no 啦!

PasswordAuthentication yes # 密码验证当然是需要的!所以这里写 yes 啰!
PermitEmptyPasswords no   # 若上面那一项如果设定为 yes 的话,这一项就最好设定 为 no,是否允许以空的密码登入!当然不许!
ChallengeResponseAuthentication yes # 挑战任何的密码认证!所以,任何 login.conf 规定的认证方式,均可适用!
#PAMAuthenticationViaKbdInt yes # 是否启用其它的 PAM 模块!启用这个模块将会导致 PasswordAuthentication 设定失效!
#RSAAuthentication yes   # 是否使用纯的 RSA 认证!?仅针对 version 1 !
PubkeyAuthentication yes  # 是否允许 Public Key ?当然允许啦!只有 version 2
AuthorizedKeysFile .ssh/authorized_keys # 上面这个在设定若要使用不需要密码登入的账号时,那么那个账号的存放档案所在档名!

# 4.3 与 Kerberos 有关的参数设定!因为我们没有 Kerberos 主机,所以底下不用设定!
KerberosAuthentication no
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes
KerberosTgtPassing no
 
# 4.4 底下是有关在 X-Window 底下使用以及转发代理相关设定!
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

# 4.5 登入后的项目:
PrintMotd no # 登入后是否显示出一些信息呢?例如上次登入的时间、地点等等,预设是 yes ,但是,如果为了安全,可以考虑改为 no !
PrintLastLog yes # 显示上次登入的信息!可以啊!预设也是 yes !
KeepAlive yes   # 一般而言,如果设定这项目的话,那么 SSH Server 会传送 KeepAlive 的讯息给 Client 端,以确保两者的联机正常!
          # 在这个情况下,任何一端死掉后, SSH 可以立刻知道!而不会有僵尸程序的发生!
UsePrivilegeSeparation yes # 使用者的权限设定项目!就设定为 yes 吧!
MaxStartups 10      # 同时允许几个尚未登入的联机画面?当我们连上 SSH ,尚未输入密码时,这个时候就是我们所谓的联机画面啦!
             # 在这个联机画面中,为了保护主机,所以需要设定最大值,预设最多十个联机画面,而已经建立联机的不计算在这十个当中

# 4.6 关于使用者抵挡的设定项目:
DenyUsers *        # 设定受抵挡的使用者名称,如果是全部的使用者,那就是全部 挡吧!若是部分使用者,可以将该账号填入!例如下列!
DenyUsers test
DenyGroups test      # 与 DenyUsers 相同!仅抵挡几个群组而已!

# 4.7 配置SSH加密套件
Ciphers aes256-ctr,aes128-ctr,aes192-ctr

# 4.8 未禁用环境处理
PermitUserEnvironment no

# 4.9 配置SSH失败尝试
MaxAuthTries

# 5. 关于 SFTP 服务的设定项目!
Subsystem sftp /usr/lib/ssh/sftp-server


ssh密匙认证
原理:密匙认证需要依靠密匙,首先创建一对密匙(包括pub公匙和pri密匙,并且用公匙加密的数据只能用密匙解密),并把公匙放到需要远程服务器上。这样当登录远程服务器时,客户端软件就会向服务器发出请求,请求用你的密匙进行认证。
服务器收到请求之后,先在你在该服务器的宿主目录下寻找你的公匙 authrozied_keys 和 knows_hosts,然后检查该公匙是否是合法,如果合法就用公匙加密一随机数(即所谓的challenge)并发送给客户端软件,客户端软件收到 “challenge”之后就用私匙解密再把它发送给服务器,因为用公匙加密的数据只能用密匙解密,服务器经过比较就可以知道该客户连接的合法性。

实验环境:

1
2
客户机:172.16.142.4
远端主机:172.16.142.5

  • Step1-修改配置文件(远端主机)
    要使ssh既能够通过证书免密码登陆,又不影响通过用户名口令登陆,需要对远端主机ssh进行配置,配置文件为:/etc/ssh/sshd_config
    1
    2
    3
    4
    5
    6
    RSAAuthentication yes  #ssh v1
    PubkeyAuthentication yes #ssh v2
    ServerKeyBits 1024
    PasswordAuthentication yes #关键点
    PermitRootLogin yes
    UsePAM no
    配置完成后执行命令 service sshd restart 来重启ssh
  • Step2-本地生成密匙(客户机)
    在客户机以root用户执行下述命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@localhost .ssh]# /usr/bin/ssh-keygen -t rsa -P 
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    # Your identification has been saved in /root/.ssh/id_rsa. #私钥
    # Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    30:f6:d7:2a:ac:56:eb:3f:fa:40:25:8d:90:96:68:cb root@localhost.localdomain
  • Step3-远程配置文件上传(远端主机)

    1
    2
    3
    4
    5
    [root@localhost .ssh]# scp /root/.ssh/id_rsa.pub root@172.16.142.5:/root/.ssh/authorized_keys
    root@172.16.142.5 password:

    #或者采用
    ssh-copy-id root@172.16.142.5

    说明:将公钥拷贝到远端主机,并写入授权列表文件,你也可以把公钥文件拷贝过去后,在远端主机下直接执行;

    1
    2
    3
    4
    5
    6
    7
    8
    touch /root/.ssh/authorized_keys
    cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

    #操作完毕,登陆检查。
    [root@localhost ~]# ssh 172.16.142.5
    Last login: Sat Dec 15 21:10:17 2007 from 172.16.142.4
    [root@localhost ~]#
    无密码SSH登陆成功!

0x02 命令详细

ssh 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ssh [选项] host参数 '命令'
ssh root@ip

#选项
-1:强制使用ssh协议版本1;
-2:强制使用ssh协议版本2;
-4:强制使用IPv4地址;
-6:强制使用IPv6地址;
-A:开启认证代理连接转发功能;
-a:关闭认证代理连接转发功能;
-b:使用本机指定地址作为对应连接的源ip地址 #(代理转发使用)
-C:请求压缩所有数据;
-D: 指定绑定地址和端口 #(代理转发使用)
-F:指定ssh指令的配置文件;
-f:后台执行ssh指令;
-g:允许远程主机连接主机的转发端口;
-i:指定身份文件;
-l:指定连接远程服务器登录用户名;
-N:不执行远程指令;
-o:指定配置选项;
-p:指定远程服务器上的端口;
-q:静默模式;
-X:开启X11转发功能;
-x:关闭X11转发功能;
-y:开启信任X11转发功能。
-T: 表示不分配伪终端,但-T相当于notty,ctrl+C会中断会话

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 示例1.指定连接ssh的用户端口
ssh root@192.168.200.250 -p 2222

# 示例2.命令执行
ssh root@10.10.100.221 'hostname -I'
Secure login: unauthorized users are not allowed to access the system.
root@10.10.100.221 password:
10.10.100.221

# 示例3.指定密匙登录
ssh root@DROPLET_IP -i /path/to/private_key
#用户名为root私钥文件路径为~/test,用户名为ubuntu,服务IP为203.111.111.111
ssh -i ~/test ubuntu@203.111.111.111


# 示例4.ssh指定用户名和指定shell类型连接(类似于反弹shell-并且不记录命令)
ssh -l root 10.10.107.222 /bin/bash
# id
# uid=0(root) gid=0(root) groups=0(root)

# 示例5.循环命令执行
for i in {16..20};do
ssh -p 20211 192.168.1.${i} 'wget http://192.168.1.1:8000/filebeatInstall.sh -O /tmp/filebeatInstall.sh && chmod +x /tmp/filebeatInstall.sh && cd /tmp/ && bash -c /tmp/filebeatInstall.sh'
done

# 示例6.端口映射转发示例
# 1) 监听本地10.10.107.242:8888端口,并将访问请求转发到10.22.0.3:80中
ssh -p 20211 -N -v -L 10.10.107.242:8888:10.22.0.3:80 root@10.10.107.242


ssh-keygen 命令
描述:生成公匙与密匙进行相应的认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa]
[-N new_passphrase] [-C comment] [-f output_keyfile]
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
ssh-keygen -i [-m key_format] [-f input_keyfile]
ssh-keygen -e [-m key_format] [-f input_keyfile]
ssh-keygen -y [-f input_keyfile]
ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
ssh-keygen -B [-f input_keyfile]
ssh-keygen -D pkcs11
ssh-keygen -F hostname [-f known_hosts_file] [-l]
ssh-keygen -H [-f known_hosts_file]
ssh-keygen -R hostname [-f known_hosts_file]
ssh-keygen -r hostname [-f input_keyfile] [-g]
ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]
[-j start_line] [-K checkpt] [-W generator]
ssh-keygen -s ca_key -I certificate_identity [-h] [-U]
[-D pkcs11_provider] [-n principals] [-O option]
[-V validity_interval] [-z serial_number] file ...
ssh-keygen -L [-f input_keyfile]
ssh-keygen -A
ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
file ...
ssh-keygen -Q -f krl_file file ...

#参数解释
-a #当保存一个新格式的私钥(即ed25519密钥或设置-o标志时的任何SSH协议2密钥)时,此选项指定KDF的数量(增加碰撞难度)
-b #生成指定位数的密匙
-l #显示指定公钥文件的指纹支持私有RSA1密钥。对于RSA和DSA密钥ssh-keygen试图找到匹配的pub-并打印其指纹。如果与-v相结合则提供了密钥的可视ASCII艺术表示。
-p #交互模式输入密码
-o #Ed25519密钥总是使用新的私钥格式,使用新的OpenSSH格式保存私钥而不是更兼容的PEM格式。新格式增加了输入量抵抗暴力破解密码 ( 必须 > 6.5 版本)
-t #指定加密类型生不同类型的密钥: rsa / dsa / ECDAS /ed25519
-f #指定私钥文件文件路径
-y #此选项将读取专用OpenSSH格式文件,并将OpenSSH公钥打印到stdout。

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#示例1.生成带密码的密匙登录认证(安全认证算法Key)
ssh-keygen -t dsa -P '123456' -f ~/.ssh/id_dsa #(不需要交互执行)

ssh-keygen -t rsa -b 1024 -p #命令行设置生成rsa密匙和交换式设置密匙密码 #(需要交互执行)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:


#生成Ed25519算法的key
ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id_ed25519 -C "john@example.com"

#示例2.命令行设置密匙密码并生成密匙
ssh-keygen -N "123456789"
ssh-keygen -P "123456789"

#示例3.终端密匙生成的目录文件
ssh-keygen -f /testdir/test/id_rsa

#示例4.根据私钥生成公钥如果密匙有密码则需要输入密码
ssh-keygen -f /testdir/test/id_rsa -y
ssh-keygen -f /testdir/test/id_rsa -y > id_rsa.pub

#示例5.当前认证公钥key加密算法及其强度
for key in ~/.ssh/id_*; do ssh-keygen -l -f "${key}" -v; done | uniq
# 2048 SHA256:pF71q3tXhtGx6EOIC/WZVKt/y9q5OCS2NviKlXVO1eY root@master (RSA)


scp 命令
描述: 注意 scp命令不会进行内容的追加而会覆盖整个文件

1
2
3
4
5
6
7
#语法:
scp [-r] 用户名@机器ip:文件路径 本地路径 # 下载文件或[文件夹]
scp [-r] 本地文件 用户名@机器ip:上传的文件路径 # 上传文件或[文件夹]

#参数
-r 表示目录
-P 指定端口(大写)

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 下载
$scp root@192.168.133.129:/root/index.html c:\\index.html #注意Windows指定路径时候需要转义符号

# 上传
$scp nssock2.zip root@192.168.133.129:/root

# 指定端口
$scp -P 18768 Architecture.c root@23.106.133.193:/root

# 覆盖已存储的文件
~$ echo 1024 > 1.txt
~$ scp -P 20211 1.txt weiyigeek@weiyigeek-108:~
**************WARNING**************
Authorized only. All activity will be monitored and reported.
1.txt 100% 5 13.2KB/s 00:00
~$ echo 1111 > 1.txt
~$ scp -P 20211 1.txt weiyigeek@weiyigeek-108:~
**************WARNING**************
Authorized only. All activity will be monitored and reported.
1.txt 100% 5 13.9KB/s 00:00
~$ ssh -p 20211 weiyigeek@weiyigeek-108 "cat 1.txt"
**************WARNING**************
Authorized only. All activity will be monitored and reported.
1111


ssh-add 命令
描述:

1
2
3
# (1) 加载私有密匙到 ssh-agent 密匙管理即默认采用此密钥进行访问操作
> ssh-agent zsh
> ssh-add ~/.ssh/id_develop


scp-copy-id 命令
描述:进行密匙的拷贝后面就能采用免密码登录;

1
2
3
4
5
6
#基础语法
/usr/bin/ssh-copy-id [-h|-?|-f|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname

#参数
- i 指定认证文件
- o 指定ssh协议选项

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#示例1.将生成的公匙存入到对端的机器的.ssh/authorized_keys
$ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.107.234 #指定公匙文件
.ssh> ssh-copy-id root@10.10.107.221 #或者 cp id_rsa.pub authorized_keys
# .ssh> ssh 'root@10.10.107.221'
# Secure login: unauthorized users are not allowed to access the system.


#示例2.一步到位
cat ~/.ssh/id_rsa.pub | ssh -p 22 zsy@10.1.0.3 "umask 077;mkdir -p ~/.ssh;cat - >> ~/.ssh/authorized_keys"
#一般是把本地生成的密匙复制到远程主机上authorized_keys文件中
[root@slave ~]$cat .ssh/authorized_keys #同时记录连接的IP
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINDMnJ7QL1PXaWI63is2wqj9HG7Gc/AxT07F4RRujyPR ubuntu@WeiyiGeek
#将每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts [Centos]
[root@slave .ssh]# cat known_hosts
10.10.107.222 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJABL46Qd7sXwu/GW2+8KCNRfUXzh+6EGKnheq6+o+Uhp4PCt6M2/pMuV2mPfeIAsE/cYL1X0vYOtLrLG3Wjun0=


#当ssh服务器未使用默认端口号时,使用如下命令
centos6中:ssh-copy-id -i ~/.ssh/id_rsa.pub "zsy@10.1.0.3 -p 22222"
centos7中:ssh-copy-id -i ~/.ssh/id_rsa.pub zsy@10.1.0.3 -p 22222

使用 known_hosts 优缺点

  • 1.需要每次手动删除文件内容,一些自动化脚本的无法运行(在SSH登陆时失败),但是安全性高;
  • 2.SSH登陆时会忽略known_hsots的访问,但是安全性低;

0x03 进阶使用


0x04 补充说明

在ssh中设置登录提示信息
/etc/issue.net #远程登录信息显示 不支持转义字符 只支持普通文本.是否显示欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定
/etc/motd #本地或远程都可显示欢迎信息

1
2
3
4
5
6
7
8
9
10
11
#修改Terminal login时得提示: 在/etc/ssh/sshd_config添加“Banner /etc/ssh/ssh_login_banner” 或者 Banner /etc/issue
/etc/issue     #本地登录信息显示
\d : Show Current System 日期
\S : 名称
\l :登录时终端编号
\m :硬件体系架构
\n : 显示主机名
\o : 显示域名
\r : 显示内核kernel版本
\t : 显示当前时间
\u : 当前登录用户的序列号

实际案例:
1
2
3
echo "Authorized uses only. 您的所有活动均被监测和报告."> /etc/issue
echo "Authorized uses only. 您的所有活动均被监测和报告."> /etc/issue.net
echo "Authorized uses only. All activity may be monitored and reported." >>/etc/motd

WeiyiGeek.issuenet

WeiyiGeek.issuenet


用SecureCRT进行免密码登陆
(1)将BT5生成的公私钥文件拷到windows本机上,打开SecureCRT新建session,配置服务器的基本信息后连接,当然这个时候是不会成功的。
(2)右键失败的session,选择“Session Options”—->”SSH2″—>”PublicKey”—>”Properties”后选择生成的私钥文件
选择完后,点击“ok”后,右键“Reconnect”即可成功登陆。


云服务器 SSH-KEY公匙/密匙登录
生成公匙和密匙:

1
2
3
4
5
6
7
#配置config文件,详细请参考从本地Linux机器登录到Linux云服务器(无公网IP)中的STEP1 /etc/ssh/ssh_config 文件
#找到ForwardAgent项,并设置为yes
chmod 400 私钥文件 #将您的私钥文件设置权限为400
eval `ssh-agent` #启动ssh-agent
ssh-add #加载私钥
ssh -i 私钥文件 系统管理员@服务器IP #对于ubuntu系统管理员为ubuntu;
ssh -i ~/test ubuntu@203.111.111.111 #centos,debian,suse用

利用公匙登录
1
2
3
/root/.ssh/authorizeb_keys      #将A机生成的.pub添加到authorizeb_keys
chmod 600 /root/.ssh/authorizeb_keys #新建文件权限加入600
/etc/init.d/start #启动secure shell


自定义SSH版本信息
描述:默认情况下telnet ip 22 端口会显示 openssh的版本信息

1
2
3
4
5
6
7
8
9
10
#搜索可执行文档和路径
$whereis sshd
sshd: /usr/sbin/sshd /usr/share/man/man8/sshd.8.gz

#替换二进制文件中的版本信息
cp /usr/sbin/sshd /usr/sbin/sshd2016.bak #复制前需要进行备份
sed -i 's/OpenSSH_4.2/OpenSSH_8.2/g' /usr/sbin/sshd #关键点
service restart sshd

$telnet 22端口测试banner信息


ssh避免首次登录服务时候需要输入yes,这时我们可以将StrictHostKeyChecking修改为no
方式1.配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
$vim /etc/ssh/ssh_config
Host *
GSSAPIAuthentication yes
# If this option is set to yes then remote X11 clients will have full access
# to the original X11 display. As virtually no X11 client supports the untrusted
# mode correctly we set this to yes.
ForwardX11Trusted yes
# Send locale-related environment variables
SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
SendEnv XMODIFIERS
StrictHostKeyChecking no 关键点

方式2.命令行方式

1
2
3
4
5
6
7
8
9
10
# 首先连接主机并且不校验主机
ssh -oStrictHostKeyChecking=no root@weiyigeek

# 之后在主机和ip地址之间生成正确的映射
#!/bin/bash
for domain in "github.com" "bitbucket.org"; do
sed -i "/$domain/d" ~/.ssh/known_hosts
line=$(ssh-keyscan $domain,`nslookup $domain | awk '/^Address: / { print $2 ; exit }'`)
echo $line >> ~/.ssh/known_hosts
done


0x06 加固脚本

Shell 脚本一览:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"[-] 系统sshd服务安全策略设置."
# 备份文件
BACKUPDIR=/tmp/
cp -a /etc/ssh/sshd_config ${BACKUPDIR}

# 服务端口
VAR_SSHD_PORT=20222

# 0.设置SSH登录前Banner警告提示
egrep -q "^\s*(banner|Banner)\s+\W+.*$" /etc/ssh/sshd_config && sed -ri "s/^\s*(banner|Banner)\s+\W+.*$/Banner \/etc\/issue.net/" /etc/ssh/sshd_config || \
echo "Banner /etc/issue.net" >> /etc/ssh/sshd_config

# 1.设置SSH禁止root远程登录(推荐配置-但还是要根据需求配置)
egrep -q "^\s*PermitRootLogin\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*PermitRootLogin\s+.+$/PermitRootLogin no/" /etc/ssh/sshd_config || echo "PermitRootLogin no" >> /etc/ssh/sshd_config

# 2.设置SSH严格模式
sudo egrep -q "^(#)?\s*StrictModes\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*StrictModes\s+.+$/StrictModes yes/" /etc/ssh/sshd_config || echo "StrictModes yes" >> /etc/ssh/sshd_config

# 3.更改SSH服务端口
sudo egrep -q "^(#)?\s*Port\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*Port\s+.+$/Port ${VAR_SSHD_PORT}/" /etc/ssh/sshd_config || echo "Port ${VAR_SSHD_PORT}" >> /etc/ssh/sshd_config

# 4.关闭禁用用户的 .rhosts 文件 ~/.ssh/.rhosts 来做为认证,缺省 IgnoreRhosts yes.
egrep -q "^(#)?\s*IgnoreRhosts\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*IgnoreRhosts\s+.+$/IgnoreRhosts yes/" /etc/ssh/sshd_config || echo "IgnoreRhosts yes" >> /etc/ssh/sshd_config
egrep -q "^(#)?\s*HostbasedAuthentication \s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*HostbasedAuthentication \s+.+$/HostbasedAuthentication no/" /etc/ssh/sshd_config || echo "HostbasedAuthentication no" >> /etc/ssh/sshd_config

# 5.设置安全协议版本
egrep -q "^(#)?\s*Protocol\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*Protocol\s+.+$/Protocol 2/" /etc/ssh/sshd_config || echo "Protocol 2" >> /etc/ssh/sshd_config

# 6.设置日志等级 默认是VERBOSE,设置为INFO
egrep -q "^(#)?\s*LogLevel\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*LogLevel\s+.+$/LogLevel INFO/" /etc/ssh/sshd_config || echo "LogLevel INFO" >> /etc/ssh/sshd_config

# 7.禁用空密码用户登录
egrep -q "^(#)?\s*PermitEmptyPasswords\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*PermitEmptyPasswords\s+.+$/PermitEmptyPasswords no/" /etc/ssh/sshd_config || echo "PermitEmptyPasswords no" >> /etc/ssh/sshd_config

# 8.配置失败尝试次数(此处,设置为5次)
egrep -q "^(#)?\s*MaxAuthTries\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*MaxAuthTries\s+.+$/MaxAuthTries 5/" /etc/ssh/sshd_config || echo "MaxAuthTries 5" >> /etc/ssh/sshd_config

# 9.配置连接空闲超时 (每120s进行心跳连接测试,若三次失败则断开链接)
egrep -q "^(#)?\s*ClientAliveInterval\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*ClientAliveInterval\s+.+$/ClientAliveInterval 120/" /etc/ssh/sshd_config || echo "ClientAliveInterval 120" >> /etc/ssh/sshd_config
egrep -q "^(#)?\s*ClientAliveCountMax\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*ClientAliveCountMax\s+.+$/ClientAliveCountMax 3/" /etc/ssh/sshd_config || echo "ClientAliveCountMax 5" >> /etc/ssh/sshd_config

# 10.不允许用户向ssh守护程序呈现环境
egrep -q "^(#)?\s*PermitUserEnvironment\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*PermitUserEnvironment\s+.+$/PermitUserEnvironment no/" /etc/ssh/sshd_config || echo "PermitUserEnvironment no" >> /etc/ssh/sshd_config

# 11.设置SSH强加密算法
egrep "^\s*Ciphers\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^\s*Ciphers\s+.+$/Ciphers aes256-ctr,aes128-ctr,aes192-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com/" /etc/ssh/sshd_config || echo "Ciphers aes256-ctr,aes128-ctr,aes192-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com" >> /etc/ssh/sshd_config

# 12.设置成功验证SSH服务器的时间为一分钟或更短
egrep -q "^(#)?\s*LoginGraceTime\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*LoginGraceTime\s+.+$/LoginGraceTime 60/" /etc/ssh/sshd_config || echo "LoginGraceTime 60" >> /etc/ssh/sshd_config

# 13.禁用X11转发及端口转发
sudo egrep -q "^(#)?\s*X11Forwarding\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*X11Forwarding\s+.+$/X11Forwarding no/" /etc/ssh/sshd_config || echo "X11Forwarding no" >> /etc/ssh/sshd_config
sudo egrep -q "^(#)?\s*X11UseLocalhost\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*X11UseLocalhost\s+.+$/X11UseLocalhost yes/" /etc/ssh/sshd_config || echo "X11UseLocalhost yes" >> /etc/ssh/sshd_config
sudo egrep -q "^(#)?\s*AllowTcpForwarding\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*AllowTcpForwarding\s+.+$/AllowTcpForwarding no/" /etc/ssh/sshd_config || echo "AllowTcpForwarding no" >> /etc/ssh/sshd_config
sudo egrep -q "^(#)?\s*AllowAgentForwarding\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*AllowAgentForwarding\s+.+$/AllowAgentForwarding no/" /etc/ssh/sshd_config || echo "AllowAgentForwarding no" >> /etc/ssh/sshd_config

# 14.设置SSH服务配置文件权限
chown root:root /etc/ssh/sshd_config
chmod og-rwx /etc/ssh/sshd_config
chown -R root:ssh_keys /etc/ssh/*key
chmod -R 400 /etc/ssh/*key
chown -R root:root /etc/ssh/*key.pub
chmod -R 444 /etc/ssh/*key.pub


0x0n 入坑解救

问题1.ssh免密码登录Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

解决: 首先修改/home/Hadoop/.ssh以及/home/Hadoop/.ssh/authorized_keys的权限;
172.16.142.4(客户端)

1
2
3
/home/root文件夹的权限是600
/home/root/.ssh文件夹的权限是600 (好像这个权限关系不是很大)
/home/root/.ssh/id_dsa私钥的权限600

172.16.142.5(远端主机)

1
2
chmod 700 /root/.ssh
chmod 644 /root/.ssh/authorized_keys #注意后面放Public-KEY的英语不要打错


问题2.SSH修改端口报错 error: Bind to port xxx on 0.0.0.0 failed: Permission denied.解决方法

问题原因:Linux修改ssh Port端口后无法启动ssh访问,发现是SELinux导致的问题;
解决办法:

1
2
3
4
5
6
7
8
9
#(1) 永久方法 – 需要重启服务器修改/etc/selinux/config文件中设置
SELINUX=disabled

#(2) 临时方法 – 设置系统参数然后重启服务器,使用命令setenforce 0
setenforce 1 #设置SELinux 成为enforcing模式
setenforce 0 #设置SELinux 成为permissive模式

#重启sshd服务
systemctl restart sshd

注意:

  • 此时如果仍提示输入密码,请检查如下文件夹和文件的操作权限,这是非常重要的,否则ssh公钥认证体制不能正常工作
  • 还有可能是禁用了root登录出现这种情况,当切换到普通用户—Hadoop之后就又能登录了
    WeiyiGeek.

    WeiyiGeek.

总结: 出现这种警告,我觉得最终的原因是文件夹以及文件的读写权限的问题。


问题3.连接ssh时出现Unable to negotiate with 192.168.XX.XX port XXXX: no matching key exchange method found.错误。

问题信息:

1
2
$ ssh-copy-id gitlab@192.168.2.3
/usr/bin/ssh-copy-id: ERROR: Unable to negotiate with 192.168.2.3 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1

问题原因: 找不到匹配的密钥交换方法,需要配置为diffie-hellman-group1-sha1,diffie-hellman-group14-sha1
解决方法:
1
2
3
4
vi ~/.ssh/config
host 192.168.2.3
port 22
KexAlgorithms +diffie-hellman-group1-sha1,diffie-hellman-group14-sha1


问题4.在使用ssh tunnel时碰到channel 1018: open failed: administratively prohibited: open failed错误.

错误信息: channel 1018: open failed: administratively prohibited: open failed
问题解决:

1
2
/etc/ssh/sshd_config
AllowTcpForwarding yes