openssh
1. openssh简介
在Linux系统中,OpenSSH是目前最流行的远程系统登录与文件传输应用,也是传统Telenet、FTP和R系列等网络应用的换代产品。 其中,ssh(Secure Shell)可以替代telnet、rlogin和rsh,scp(Secure Copy)与sftp(Secure FTP)能后替代ftp。
OpenSSH采用密钥的方式对数据进行加密,确保数据传输的安全。在正式开始传输数据之前,双方首先要交换密钥,当收到对方的数据时, 再利用密钥和相应的程序对数据进行解密。这种加密的数据传输有助于防止非法用户获取数据信息。
OpenSSH采用随机的方式生成公私密钥。密钥通常只需生成一次,必要时也可以重新制作。
当使用ssh命令登录到远程系统时,OpenSSH服务器的sshd守护进行将会发送一个公钥,OpenSSH客户端软件ssh将会提示用户确认是否接收发送的公钥。 同时,OpenSSH客户端也会向服务器回传一个密钥,使OpenSSH连接双方的每个系统都拥有对方的密钥,因而能够解密对方经由加密链路发送的加密数据。
OpenSSH服务器的公钥与私玥均存储在/etc/ssh目录中。在OpenSSH客户端,用户收到的所有公钥, 以及提供密钥的OpenSSH服务器的IP地址均存储在用户主目录下的~/.ssh/known_hosts文件中(.ssh是一个隐藏目录)。 如果密钥与IP地址不再匹配,OpenSSH将会认为某个环节出了问题。例如,重新安装操作系统或者升级OpenSSH都会导致系统再次生成新的密钥, 恶意的网络攻击也会造成密钥的变动。因此,当密钥发生变化时,总是应当先了解密钥发生变化的原因,以确保网络访问期间的数据安全。
2. SSH 认证方式
openssh 有两种认证方式,分别是:
3. openSSH 的工作模式
openSSH 是基于C/S架构工作的。
服务器端 //sshd,配置文件在/etc/ssh/sshd_config
客户端 //ssh,配置文件在/etc/ssh/ssh_config
ssh-keygen //密钥生成器
ssh-copy-id //将公钥传输至远程服务器
scp //跨主机安全复制工具
4. penSSH程序简介
OpenSSH的分为客户端和服务端两部分
-
Clients端的配置文件:/etc/ssh/ssh_config -
Server端的配置文件:/etc/ssh/sshd_config -
Server端服务脚本:/etc/rc.d/init.d/sshd -
OpenSSH在Linux系统中默认是安装并启动的
openssh 主要的关键包有四个
openssh.x86_64 5.3p1-104.el6 //服务端和客户端的公共组件 openssh-askpass.x86_64 5.3p1-104.el6 // openssh-clients.x86_64 5.3p1-104.el6 //客户端安装包 openssh-server.x86_64 5.3p1-104.el6 //服务端安装包
openssl-clients 几个常用文件
[root@localhost ~]# rpm -ql openssh-clients /etc/ssh/ssh_config //客户端配置文件 /usr/bin/scp //远程复制文件 /usr/bin/sftp //远程文件共享 /usr/bin/slogin /usr/bin/ssh /usr/bin/ssh-add /usr/bin/ssh-agent /usr/bin/ssh-copy-id /usr/bin/ssh-keyscan
openssl-server 几个常用文件
/etc/rc.d/init.d/sshd /etc/ssh/sshd_config /etc/sysconfig/sshd
5. 服务器端配置文件/etc/ssh/sshd_config 主要参数详解
参数 | 注释 |
---|
#Port 22 | //默认端口号,为了其安全一般要更改为其他端口 | #AddressFamily any | //说明要监听任意地址 | #ListenAddress 0.0.0.0 | //监听本机所有IPV4的ip | #ListenAddress :: | //监听本机所有的IPV6的地址 | Protocol 2 | 监听的协议版本 | # HostKey for protocol version 1 | //说明key的协议版本 | SyslogFacility AUTHPRIV | //使用AUTHPRIV 记录日志 | #LogLevel INFO | //log日志级别 | #Authentication: | //认证相关 | #PermitRootLogin yes | //是否支持管理员直接登陆 | #StrictModes yes | //是否使用严格模式 (严格检查用户的某些相关信息) | #RSAAuthentication yes | //是否支持RSA密钥认证 | #PubkeyAuthentication yes | //是否支持公钥认证 |
客户端配置文件时登陆别人的ssh使用的
参数 | 注释 |
---|
#Host * | //表示连接所有主机 | #Port 22 | //默认连接端口 | #Cipher 3des | //加密时使用的加密机制 | #StrictHostKeyChecking ask | //严格的主机秘钥检查 即第一次连接时是否询问 |
6. ssh 示例
服务端 | 192.168.200.145 |
---|
客户端 | 192.168.200.146 |
// 查看服务端ip
[root@localhost ~]
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:88:82:3d brd ff:ff:ff:ff:ff:ff
inet 192.168.200.145/24 brd 192.168.200.255 scope global dynamic noprefixroute ens160
valid_lft 1299sec preferred_lft 1299sec
inet6 fe80::895:55db:fec3:a307/64 scope link noprefixroute
valid_lft forever preferred_lft forever
// 连接客户端
[root@localhost ~]
The authenticity of host '192.168.200.146 (192.168.200.146)' can't be established.
ECDSA key fingerprint is SHA256:lHjJVpgxAHQML7Nzdt8CT4/1AZePELgM5EEUPTONw9A.
Are you sure you want to continue connecting (yes/no/[fingerprint])? y
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added '192.168.200.146' (ECDSA) to the list of known hosts.
root@192.168.200.146's password:
Last login: Sat Sep 25 22:06:28 2021 from 192.168.200.1
///w命令可以显示当前登录到计算机的用户列表。这对于显示哪些用户使用ssh从哪些远程位置进行了登录以及执行了何种操作等内容特别有用
[root@localhost ~]
22:17:45 up 15 min, 3 users, load average: 0.15, 0.14, 0.09
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.200.1 22:06 2:25 0.00s 0.00s -bash
root pts/1 192.168.200.1 22:06 11:17 0.82s 0.81s top
root pts/2 192.168.200.145 22:16 1.00s 0.00s 0.00s w
7. SSH 主机密钥
ssh 通过公钥加密的方式保持通信安全。当某一ssh 客户端连接到ssh 服务器时,在该客户端登录之前,服务器会向其发送公钥副本。这可用于为通信渠道设置安全加密,并可验证客户端的服务器。
当用户第一次使用ssh 连接到特定服务器时,ssh 命令可在用户的/.ssh/known_hosts文件中存储该服务器的公钥。在此之后每当用户进行连接时,客户端都会通过对比/.ssh/known_hosts文件中的服务器条目和服务器发送的公钥,确保从服务器获得相同的公钥。如果公钥不匹配,客户端会假定网络通信已遭劫持或服务器已被入侵,并且中断连接。
这意味着,如果服务器的公钥发生更改(由于硬盘出现故障导致公钥丢失,或者出于某些正当理由替换公钥),用户则需要更新其~/.ssh/known_hosts文件并删除旧的条目才能够进行登录。
//主机ID存储在本地客户端系统上的 ~/.ssh/known_hosts 中
[root@localhost ~]
192.168.200.146 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGjn882l1yxhu5x+2tcWwzF8EaWiKzp9dsn5ySH2DPWYxXItnA139UqQ+fpOnTMnYc/AYtHZ6GuZp46XWCuefTI=
/主机密钥存储在SSH服务器上的 /etc/ssh/ssh_host_key* 中
[root@localhost ~]
moduli ssh_host_ecdsa_key.pub
ssh_config ssh_host_ed25519_key
ssh_config.d ssh_host_ed25519_key.pub
sshd_config ssh_host_rsa_key
ssh_host_ecdsa_key ssh_host_rsa_key.pub
8. 配置基于 SSH 密钥的身份验证
用户可通过使用公钥身份验证进行ssh登录身份验证。ssh允许用户使用私钥-公钥方案进行身份验证。这意味着将生成私钥和公钥这两个密钥。私钥文件用作身份验证凭据,像密码一样,必须妥善保管。公钥复制到用户希望登录的系统,用于验证私钥。公钥并不需要保密。拥有公钥的ssh服务器可以发布仅持有您私钥的系统才可解答的问题。因此,可以根据所持有的密钥进行验证。如此一来,就不必在每次访问系统时键入密码,但安全性仍能得到保证。
使用ssh-keygen命令生成密码。将会生成私钥/.ssh/id_rsa和公钥/.ssh/id_rsa.pub。
注意:
生成密钥时,系统将提供指定密码的选项,在访问私钥时必须提供该密码。如果私钥被偷,除颁发者之外的其他任何人很难使用该私钥,因为已使用密码对其进行保护。这样,在攻击者破解并使用私钥前,会有足够的时间生成新的密钥对并删除所有涉及旧密钥的内容。
生成ssh密钥后,密钥将默认存储在家目录下的.ssh/目录中。私钥和公钥的权限就分别为600和644。.ssh目录权限必须是700。
在可以使用基于密钥的身份验证前,需要将公钥复制到目标系统上。可以使用ssh-copy-id完成这一操作注意:
生成密钥时,系统将提供指定密码的选项,在访问私钥时必须提供该密码。如果私钥被偷,除颁发者之外的其他任何人很难使用该私钥,因为已使用密码对其进行保护。这样,在攻击者破解并使用私钥前,会有足够的时间生成新的密钥对并删除所有涉及旧密钥的内容。
生成ssh 密钥后,密钥将默认存储在家目录下的.ssh/ 目录中。私钥和公钥的权限就分别为600 和644 。.ssh 目录权限必须是700 。
在可以使用基于密钥的身份验证前,需要将公钥复制到目标系统上。可以使用ssh-copy-id 完成这一操作
[root@localhost ~]
通过ssh-copy-id 将密钥复制到另一系统时,它默认复制~/.ssh/id_rsa.pub 文件
[root@localhost ~]
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:
SHA256:hbCvqzUsrv+8ifUz1vsJap7twg/3qg/RBKgIg388IuU root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
|. ... |
|+ . .o o |
| * o .. . o |
|. E = . + |
| . o . S . |
| . . . |
| . *.o.o |
| . * =BB.o . |
| .o=o*=*OB++ |
+----[SHA256]-----+
[root@localhost ~]# ssh-copy-id root@192.168.200.146
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/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@192.168.200.146's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.200.146'"
and check to make sure that only the key(s) you wanted were added.
9. scp远程复制工具的使用简介
语法:
两种模式:
// 复制当前主机上的/root/222至192.168.200.146主机的/opt/目录下
[root@localhost ~]
222 100% 0 0.0KB/s 00:00
// 复制远程主机/etc/fstab至当前主机当前目录下
[root@localhost ~]
fstab 100% 579 589.9KB/s 00:00
[root@localhost ~]
111 222 anaconda-ks.cfg fstab
10. 自定义 SSH 服务配置
虽然OpenSSH 服务器通常无需修改,但会提供其他安全措施,可以在配置文件/etc/ssh/sshd_config 中修改OpenSSH 服务器的各个方面。
PermitRootLogin {yes|no} //是否允许root用户远程登录系统
PermitRootLogin without-password //仅允许root用户基于密钥方式远程登录
PasswordAuthentication {yes|no} //是否启用密码身份验证,默认开启
11. SSH 安全注意事项
[root@localhost ~]# tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 |xargs
SKvaBq4ijHT3W53WP1jyMdMqwE7ffJ // //生成30位的密码
- 使用非默认端口
- 限制登录客户端地址
- 仅监听特定的IP地址
- 禁止管理员直接登录
- 仅允许有限制用户登录
- 使用基于密钥的认证
- 禁止使用空密码
- 禁止使用SSHv1版本
- 设定空闲会话超时时长
- 利用防火墙设置ssh访问策略
- 限制ssh的访问频度和并发在线数
- 做好日志的备份,经常分析(集中于某台服务器)
|