文章目录
SSH概述
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
SSH协议功能
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的"通道" 。
服务端主程序:/usr/bin/sshd
服务端配置文件: /etc/ssh/sshd_config
默认监听端口为 22
SSH配置范例
SSH验证有两种,一种是密码验证,另一种是密钥对验证
密码验证方式 查看SSH相关文件
可以在 /etc 下看到ssh相关的文件
[root@fuwuduan etc]# ll |grep ssh*
drwxr-xr-x. 2 root root 225 6月 16 00:56 ssh
[root@fuwuduan etc]# cd ssh/
[root@fuwuduan ssh]# ll
总用量 604
-rw-r--r--. 1 root root 581843 4月 11 2018 moduli
-rw-r--r--. 1 root root 2276 4月 11 2018 ssh_config
-rw-------. 1 root root 3907 4月 11 2018 sshd_config
-rw-r-----. 1 root ssh_keys 227 6月 16 00:56 ssh_host_ecdsa_key
-rw-r--r--. 1 root root 162 6月 16 00:56 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys 387 6月 16 00:56 ssh_host_ed25519_key
-rw-r--r--. 1 root root 82 6月 16 00:56 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys 1675 6月 16 00:56 ssh_host_rsa_key
-rw-r--r--. 1 root root 382 6月 16 00:56 ssh_host_rsa_key.pub
为方便观察,可以先将服务端改个名
root@zhuji sbin]# hostname fuwuduan
[root@zhuji sbin]# su
首先查看一下,服务器端的用户有哪些
[root@fuwuduan ssh]# tail -5 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
g:x:1000:1000:g:/home/g:/bin/bash
tom:x:1001:1002::/home/tom:/bin/bash
named:x:25:25:Named:/var/named:/sbin/nologin
kh1:x:1002:1003::/home/kh1:/bin/bash
我们这边就使用 kh1 用户进行实验吧
远程登录服务端
打开一台别的客户机,先尝试使用 root 用户登录到服务器
[root@localhost ~]# ssh [email protected]
The authenticity of host '20.0.0.132 (20.0.0.132)' can't be established.
ECDSA key fingerprint is SHA256:k7SljIMiRH+sv0oL3PytOMZOq94U5sbzRkcCXLBxr2M.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '20.0.0.132' (ECDSA) to the list of known hosts.
[email protected]'s password:
Last login: Wed Jul 8 19:51:36 2020
禁止远程登录root用户
发现竟然是可以登录的,但是从别的地方随意登录 root 用户这种权限很大的用户,就很危险,所以需要更改一下,让root用户不可以从别的客户端登录,进入配置文件,对下面的配置进行修改
[root@fuwuduan ssh]# vim /etc/ssh/sshd_config 编辑服务端配置文件
#LoginGraceTime 2m 会话时间2分钟,若保持长连接会占用资源
#PermitRootLogin yes PermitRootLogin yes 允许root用户登录
#StrictModes yes
#MaxAuthTries 6 最大尝试次数 6次
#MaxSessions 10 最大允许十个终端连接
那么只要把root用户登录的配置进行修改就OK了,修改完成记得重启!
PermitRootLogin no
[root@fuwuduan ssh]# systemctl restart sshd
再次登录,会发现root用户即使输入正确的密码,也不能登录了,但是使用别的用户还是可以登录的
[root@localhost ~]# ssh [email protected]
root@20.0.0.132's password:
Permission denied, please try again.
[root@localhost ~]# ssh [email protected]
[email protected]'s password:
绕过权限远程登录root
但是这样登录有一个小小的方法可以使用root登录,那就是登录别的用户,再切换到root用户
[root@localhost ~]# ssh [email protected]
kh1@20.0.0.132's password:
Last login: Wed Jul 8 20:15:52 2020 from 20.0.0.135
[kh1@localhost ~]$ su
密码:
ABRT 已检测到 '1' 个问题。预了解详细信息请执行:abrt-cli list --since 1594209794
[root@localhost kh1]#
解决root远程登录绕过
那么这个问题怎么解决呢?就需要修改之前说过的 pam.d 文件了,禁止一般用户切换root
去掉如下文件的第六行注释即可
[root@localhost ~]# vi /etc/pam.d/su
1 #%PAM-1.0
2 auth sufficient pam_rootok.so
3 # Uncomment the following line to implicitly trust users in the "wheel" group.
4 #auth sufficient pam_wheel.so trust use_uid
5 # Uncomment the following line to require a user to be in the "wheel" group.
6 #auth required pam_wheel.so use_uid
7 auth substack system-auth
8 auth include postlogin
9 account sufficient pam_succeed_if.so uid = 0 use_uid quiet
10 account include system-auth
11 password include system-auth
12 session include system-auth
13 session include postlogin
14 session optional pam_xauth.so
再次尝试,就无法切换了
[kh1@localhost ~]$ su
密码:
su: 拒绝权限
修改登录密码尝试数量
还是修改配置文件里的选项
MaxAuthTries 6
[kh1@localhost ~]$ ssh kh1@20.0.0.132
kh1@20.0.0.132's password:
Permission denied, please try again.
[email protected]'s password:
Permission denied, please try again.
kh1@20.0.0.132's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
修改之后再次尝试远程登录,看看是不是六次
发现三次就不允许登录了,是因为系统默认的网络连接次数是三次,所以三次就不允许尝试了,这种也是可以改的
在客户机连接之前敲这行命令
[root@localhost ~]# ssh -o NumberOfPasswordPrompts=8 [email protected]
kh1@20.0.0.132's password:
Permission denied, please try again.
[email protected]'s password:
Permission denied, please try again.
kh1@20.0.0.132's password:
Permission denied, please try again.
[email protected]'s password:
Permission denied, please try again.
kh1@20.0.0.132's password:
Permission denied, please try again.
[email protected]'s password:
Received disconnect from 20.0.0.132 port 22:2: Too many authentication failures
Disconnected from 20.0.0.132 port 22
[root@localhost ~]#
发现就是六次了
白名单与黑名单
白名单 AllowUsers:仅允许某些用户,拒绝白名单之外的所有人,安全场合高
黑名单 DenyUsers:仅拒绝某些用户,允许出黑名单外的所有人,安全场合低
这两条需要手敲!
白名单演示
[root@localhost ~]# useradd kh2
[root@localhost ~]# passwd kh2
[root@localhost ~]# vim /etc/ssh/sshd_config
AllowUsers kh1 kh2@20.0.0.132 白名单 kh1 后面不加 ip 表示无限制 kh2只能用20.0.0.132登录
[root@localhost ~]# systemctl restart sshd
来吧!展示!
[root@localhost ~]# ssh [email protected]
kh1@20.0.0.132's password:
Last failed login: Wed Jul 8 22:28:12 CST 2020 from 20.0.0.135 on ssh:notty
There were 5 failed login attempts since the last successful login.
Last login: Wed Jul 8 22:28:01 2020 from 20.0.0.135
[kh1@localhost ~]$ exit
登出
Connection to 20.0.0.132 closed.
[root@localhost ~]# ssh [email protected]
[email protected]'s password:
Permission denied, please try again.
黑名单演示
[root@localhost ~]# useradd kh3
[root@localhost ~]# passwd kh3
[root@localhost ~]# vim /etc/ssh/sshd_config
AllowUsers kh1 kh2@20.0.0.132 我没有删除白名单里的kh1
DenyUsers kh1 kh3
[root@localhost ~]# systemctl restart sshd
来吧!演示!
[root@localhost ~]# ssh [email protected]
[email protected]'s password:
Permission denied, please try again.
发现白名单和黑名单同时有一个用户时,是以黑名单为优先级的
密钥对验证
密钥对整体实现过程
一、由客户端的用户在本地创建密钥对
二、上传公钥文件
三、将密钥对导入到服务器某个已知用户的公钥数据库
四、以服务端那个已知用户的身份进行密钥对验证登录
基本操作
在主配置文件中保证三个选项和我一致
在客户机中创建一个新用户,并赋予密码
[root@localhost ~]# useradd bgs
[root@localhost ~]# passwd bgs
更改用户 bgs 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# su bgs
创建加密方式
[bgs@localhost root]$ ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/bgs/.ssh/id_ecdsa): #默认位置
Created directory '/home/bgs/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/bgs/.ssh/id_ecdsa.
Your public key has been saved in /home/bgs/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:XKkWpb9UgmA461aI9Ix4Aj0EUM4KP/I5iY/Ebgp31V8 [email protected]
The key's randomart image is:
+---[ECDSA 256]---+
|+=o .o . |
|.o+ o. . + . |
|ooo* + + + . |
|+o+ = .o = o |
|ooo. .. S o E |
|.+ +o. . o o |
|oo*.. o |
|+= o |
|=.. |
+----[SHA256]-----+
[bgs@localhost root]$
这时候在根目录下就能看到这个隐藏文件了
将公钥发送给服务端
隐藏文件夹里可以看到公钥和私钥文件
[bgs@localhost ~]$ cd .ssh/
[bgs@localhost .ssh]$ ls
id_ecdsa id_ecdsa.pub
将公钥文件发送给服务器
[bgs@localhost .ssh]$ ssh-copy-id -i id_ecdsa.pub [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_ecdsa.pub"
The authenticity of host '20.0.0.132 (20.0.0.132)' can't be established.
ECDSA key fingerprint is SHA256:k7SljIMiRH+sv0oL3PytOMZOq94U5sbzRkcCXLBxr2M.
ECDSA key fingerprint is MD5:89:ef:3e:43:e2:1a:0c:44:2a:c4:7f:91:43:99:f1:18.
Are you sure you want to continue connecting (yes/no)? yes
/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
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
这时候就可以在服务器上查看到了
[root@localhost ~]# cd /home/kh1
[root@localhost kh1]# ls -a
. .. .bash_history .bash_logout .bash_profile .bashrc .cache .config .mozilla .ssh
[root@localhost kh1]# cd .ssh/
[root@localhost .ssh]# ls -a
. .. authorized_keys
[root@localhost .ssh]# cat authorized_keys
进行密钥对登录验证
[bgs@localhost .ssh]$ ssh [email protected]
Enter passphrase for key '/home/bgs2/.ssh/id_ecdsa':
Enter passphrase for key '/home/bgs2/.ssh/id_ecdsa':
Last failed login: Sat Jul 11 17:59:56 CST 2020 from 20.0.0.135 on ssh:notty
There were 3 failed login attempts since the last successful login.
免密登录
[bgs2@localhost .ssh]$ ssh-agent bash
[bgs2@localhost .ssh]$ ssh-add
Enter passphrase for /home/bgs2/.ssh/id_ecdsa:
Identity added: /home/bgs2/.ssh/id_ecdsa (/home/bgs2/.ssh/id_ecdsa)
[bgs2@localhost .ssh]$ ssh [email protected]
Last login: Sat Jul 11 18:01:11 2020 from 20.0.0.135
远程文件控制
远程复制文件到本机
在主机中创建一个文件夹,在文件夹里创建一个文件
[kh1@zhuji shiyan]$ cd ~
[kh1@zhuji ~]$ pwd
/home/kh1
[kh1@zhuji ~]$ ll
总用量 0
[kh1@zhuji ~]$ touch fuzhi2
从客户机中复制这个文件到 /mnt
[root@localhost mnt]# scp [email protected]:/home/kh1/fuzhi2 /mnt
[email protected]'s password:
fuzhi2 100% 0 0.0KB/s 00:00
[root@localhost mnt]# ll
总用量 0
-rw-r--r--. 1 root root 0 7月 11 19:29 fuzhi2
复制本机文件给对方
[root@localhost mnt]# touch wenjian
[root@localhost mnt]# scp wenjian [email protected]:/home/kh1
[email protected]'s password:
wenjian
在对方机器查看
[kh1@zhuji ~]$ ll
总用量 0
-rw-rw-rw-. 1 kh1 kh1 0 7月 11 19:20 fuzhi2
-rw-r--r--. 1 kh1 kh1 0 7月 11 19:34 wenjian
[kh1@zhuji ~]$
FSTP命令
[root@localhost /]# sftp [email protected]
[email protected]'s password:
Connected to 20.0.0.132.
sftp> ll
Invalid command.
sftp> ls
fuzhi2 wenjian