第一章 ssh简介
1. ssh含义
SSH服务端是一个守护进程(daemon),它在后台运行并相应来自客户端的连接请求。SSH服务端的进程名为sshd,负责实时监听远程SSH客户端的连接请求,并进行处理,一般包括公共密钥认证、密钥交换、对称密码加密和非安全连接等。这个SSH服务就是我们前面基础系统优化中保留开机自启动的服务之一。
SSH客户端包含ssh以及像scp(远程拷贝)、slogin(远程登录)、sftp(安全FTP文件传输)等应用程序。
ssh工作机制大致是本地的ssh客户端先发送一个连接请求到远程的ssh服务端,服务端检查连接的客户端发送的数据包和IP地址,如果确认合法,就会发送密钥给SSH的客户端,此时,客户端本地再将密钥发回给服务端,自此连接建立。SSH 1.x和SSH 2.前者为密码后者是密钥
2. 基于口令的安全验证
基与口令的安全验证的方式就是大家现在一直在用的,只要知道服务器的SSH连接账号和口令(当然也要知道对应服务器的IP及开放的SSH端口,默认为22),就可以通过ssh客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。
[root@nfs01 ~]# ssh -p22 root@10.0.0.41
root@10.0.0.41's password:
Last login: Fri May 12 11:50:03 2017 from 10.0.0.253
[root@backup ~]# exit
logout
Connection to 10.0.0.41 closed.
[root@nfs01 ~]#
3. 基于密钥(钥匙锁头)的安全验证
基于密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一堆密钥对,然后把公用密钥(锁头)放在需要访问的目标服务器,另外,还需要把私有密钥(钥匙)(Private key)放到SSH的客户端或对应的客户端服务器上。
SSH客户端收到质询之后就可以用自己的私钥解密,再把它发送给SSH服务器,使用这种方式,需要知道联机用户的密钥文件。与第一种基于口令验证的方式相比,第二种方式不需要在网络上传送口令密码,所以安全性更高了,这时我们也要注意保护我们的密钥文件,特别是私钥文件,一旦被黑客获取,危险就很大了。
4. SSH配置文件信息
修改SSH服务的运行参数,是通过修改配置文件/etc/ssh/sshd_config实现的。
一般来说SSH服务使用默认的配置已经能够很好的工作了,如果对安全要求不高,仅仅提供SSH服务的情况,可以不需要修改任何配置。
命令参数 | 参数说明 |
---|---|
Port | 指定sshd进程监听的端口号,默认为22。可以使用多条指令监听多个端口,默认将在本机的所有网络接口上监听,但是可以通过ListenAddress指定只在某个特定的接口上进行监听。 |
PermitEmptyPasswords | 是否允许密码为空的用户远程登录。默认为“no” |
PermitRootLogin | 是否允许root登录。可用值如下:yes表示允许,NO表示为禁止。Without-password表示禁止使用密码认证登录。Forced-commands-only表示只有在指定了command选项的情况下才允许使用公钥认证登录,同时其它认证方法全部被禁止。这个值常用于做远程备份之类的事情。1.多开一个窗口。2.临时多部署一条连接方式。3给普通用户sudo权限。 |
UseDNS | 指定sshd是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP地址真是对应。默认值为yes |
ListenAddress | 指定监听并提供服务相应的网卡地址信息。 |
5. 钥匙和锁头的使用过程
连接服务的ssh客户端,创建出密钥和锁头
连接服务的ssh客户端,将锁头发送给ssh服务端
连接服务的ssh客户端,发出连接请求
ssh服务端收到连接请求后,会发出质询信息,你想链接我,你能打开我的锁头吗
ssh客户端利用钥匙解密了质询,至此钥匙和锁头就匹配了,将匹配后的结果告知服务器端
ssh服务端认可匹配结果,连接请求建立
第二章 查看端口命令总结
1. ss
[root@nfs01 ~]# ss -lntup |egrep 22
udp UNCONN 0 0 *:57343 *:* users:(("rpc.statd",1223,7))
udp UNCONN 0 0 127.0.0.1:975 *:* users:(("rpc.statd",1223,4))
udp UNCONN 0 0 :::40163 :::* users:(("rpc.statd",1223,9))
tcp LISTEN 0 128 :::22 :::* users:(("sshd",1349,4))
tcp LISTEN 0 128 *:22 *:* users:(("sshd",1349,3))
tcp LISTEN 0 128 *:15735 *:* users:(("rpc.statd",1223,8))
tcp LISTEN 0 128 :::28156 :::* users:(("rpc.statd",1223,10))
2. netstat
[root@nfs01 ~]# netstat -lntup |egrep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1349/sshd
tcp 0 0 0.0.0.0:15735 0.0.0.0:* LISTEN 1223/rpc.statd
tcp 0 0 :::22 :::* LISTEN 1349/sshd
tcp 0 0 :::28156 :::* LISTEN 1223/rpc.statd
udp 0 0 0.0.0.0:57343 0.0.0.0:* 1223/rpc.statd
udp 0 0 127.0.0.1:975 0.0.0.0:* 1223/rpc.statd
3. lsof
[root@nfs01 ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1349 root 3u IPv4 11110 0t0 TCP *:ssh (LISTEN)
sshd 1349 root 4u IPv6 11112 0t0 TCP *:ssh (LISTEN)
sshd 2617 root 3r IPv4 19684 0t0 TCP 10.0.0.31:ssh->10.0.0.253:54109 (ESTABLISHED)
4. namp
[root@nfs01 ~]# nmap -p 22 10.0.0.41
Starting Nmap 5.51 ( http://nmap.org ) at 2017-05-12 15:07 CST
Nmap scan report for 10.0.0.41
Host is up (0.00028s latency).
PORT STATE SERVICE
22/tcp open ssh
MAC Address: 00:0C:29:A0:B1:48 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
5. telnet
telnet 10.0.0.41 22
第三章 scp用法
本地nfs客户端推送到rsync服务端
[root@backup ~]# scp /etc/hosts root@172.16.1.31:/data/
root@172.16.1.31's password:
hosts 100% 321 0.3KB/s 00:00
[root@nfs01 data]# ll
total 4
-rw-r--r-- 1 root root 321 May 12 16:01 hosts
本地nfs客户端从rsync服务端拉
[root@backup ~]# scp root@172.16.1.31:/etc/hosts /tmp/
root@172.16.1.31's password:
hosts 100% 320 0.3KB/s 00:00
第四章 SSH入侵案例说明
- 如何防止SSH登录入侵小结:
- 用密钥登录,不用密码登录。
- 牤牛阵法:解决SSH安全问题
- 防火墙封闭,SSH,,指定源IP限制(局域网、信任公网)
- 开启SSH只监听本地内网IP(ListenAddress 172.16.1.61)
- 尽量不给服务器外网IP
- 最小化(软件安装-授权)
- 给系统的重要文件或命令做一个指纹 md5sum /etc/hosts >/tmp/hosts_finger.txt grep XXX
/tmp/hosts_finger.txt - 给他上锁chattr +i +a
第五章 ssh+key共享密钥部署流程说明
1. 生成钥匙 锁头 (密钥对)
[root@m01 ~]# ssh-keygen -t dsa
Generating public/private dsa key pair. #生成一对dsa类型的秘钥对(公钥和私钥)
Enter file in which to save the key (/root/.ssh/id_dsa): #想要把你的密钥对放在哪里 默认即可
Enter passphrase (empty for no passphrase): #给你的钥匙锁头 加上个密码把。 回车
Enter same passphrase again: #确认
Your identification has been saved in /root/.ssh/id_dsa. #私钥放置的位置(钥匙)
Your public key has been saved in /root/.ssh/id_dsa.pub. #公钥放置的位置(锁头)
The key fingerprint is:
e8:26:51:ba:ed:f0:00:37:a7:3a:ab:ab:34:83:0a:9e root@m01
The key's randomart image is:
+--[ DSA 1024]----+
| |
| |
| . |
| o . |
| . = o S |
|. o O |
|o+ * + |
|= =. B |
|*Eoo o |
+-----------------+
[root@m01 ~]# ll ~/.ssh -d
drwx------ 2 root root 4096 2017-04-18 09:42 /root/.ssh
[root@m01 ~]# ls -l /root/.ssh/
total 12
-rw------- 1 root root 668 Jan 5 16:37 id_dsa ###私钥 钥匙
-rw-r--r-- 1 root root 598 Jan 5 16:37 id_dsa.pub ####公钥 锁头
-rw-r--r-- 1 root root 1576 Jan 5 14:58 known_hosts
第六章 公钥(锁头)如何传远端端服务端
1. 查看sshd端口
[root@m01 ~]# netstat -lntup |egrep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1192/sshd
tcp 0 0 :::22 :::* LISTEN 1192/sshd
2. 指定公钥文件发送至服务端IP
[root@ansible01-61 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.111
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.16.1.111's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '172.16.1.111'"
and check to make sure that only the key(s) you wanted were added.
3. ssh-copy-id是个脚本文件
[root@m01 ~]# file `which ssh-copy-id`
/usr/bin/ssh-copy-id: POSIX shell script text executable
4. 删除远端服务器的公钥文件
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub "-p52113 root@172.16.1.41"
说明:根据命令脚本,修改$1传参信息,从而实现根据ssh不同端口传送公钥文件
============================================
#!/bin/bash
until [ $# -eq 0 ]
do
echo $*
shift
done
============================================
5. ssh-copy-id执行过程
ssh $1 "exec sh -c 'umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh/authorized_keys >/dev/null 2>&1 || true)'"
①. 临时设置了一下umask 077
②. 看目标服务器是否存在 ~/.ssh 目录
③. 如果目录不存在,则创建 mkdir ~/.ssh
④. 把id_dsa.pub内容 放到了 ~/.ssh/authorized_keys
authorized_keys文件内容实质上等于id_dsa.pub公钥文件内容
6. ssh服务如何识别公钥文件
[root@m01 ~]# vim /etc/ssh/sshd_config
49 #AuthorizedKeysFile .ssh/authorized_keys
说明:利用ssh服务配置文件,识别公钥文件信息
7. 操作后检查直接输入命令
[root@m01 ~]# ssh root@172.16.1.31 hostname
nfs01
8. ssh服务分发公钥实质执行过程
- 管理服务器创建私钥和公钥(密钥对)
- 将公钥文件远程传送复制到被管理服务器相应用户~/.ssh下,并修改.ssh目录权限为700
- 修改公钥文件文件名称为authorized_keys,授权权限为600
- 利用ssh服务配置文件的配置参数,进行识别公钥文件authorized_keys
- 进而实现基于密钥远程登录服务器(免密码登录/非交互方式登录)
第七章 ssh+key公钥批量分发
1. 生成密钥阻碍因素处理办法(非交互)
[root@m01 script]# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P '' -q
ssh-dss AAAAB3NzaC1kc3MAAACBAI6xLEXhSXfNcpmh/64vmOhgZjU4y/KvYRvUkBptp7dDYhHeVLRh3fCMmuPy4PCyMg3eWbinWV2Wv9az83g/bG7sNhmwIWCeey/9UD7Iiyzv4azOHR65gbKoPfOGEOjZ1XvV3dJS9wjgyK59xuhOyYEP+dI86J8l8H7uJ131XH7NAAAAFQCjiQqnJZV44vroP+sP23MPYMOMGQAAAIALpuvd8WWO2dgrgFCOE9SDeZtlTDyeXLoqj/A+04SYFk3u6lh6R4iOVE6arWB9w81aPPh1X0mXXgKJT4j5o7iET/NS7jW43JGnyqsM8DFadQ1atNqzUHRezCfw96v7d8hWFuGEFnyckY3zJyeD/Ri9RDpCMxa/ZDsVZWU3U/Ld6gAAAIBgRsOUF4TNbK6AG6phjoLPIkLvpvOunZveB4e+Ul0ikJDIJror1NJM8epWzEuBUZQd4T+mrfW8q5UYNDAlwxsI4F9t1Cdc4EH5ce3/s+lFnIAdiR8thfn0IFMrFFb/iN8fcIaazcE8MNKyJLJyzPv0F19Kxco7lYv/0Wnq8YkwUQ==
2. ssh连接密码信息阻碍问题解决方式
#!/bin/bash
for ip in 7 31 41
do
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
done