在Linux系统中,OpenSSH是目前最流行的远程系统登录与文件传输应用。
OpenSSH采用密钥的方式对数据进行加密,确保数据传输的安全。在正式开始传输数据之前,双方首先要交换密钥,当收到对方的数据时,再利用密钥和相应的程序对数据进行解密。这种加密的数据传输有助于防止非法用户获取数据信息。
当使用ssh命令登录到远程系统时,OpenSSH服务器的sshd守护进程将会发送一个公钥,OpenSSH客户端软件ssh将会提示用户确认是否接收发送钥。同时,OpenSSH客户端也会向服务器回传一个密钥,使OpenSSH连接双方的每个系统都拥有对方的密钥,因而能够解密对方经由加密链路发送的加密数据。
OpenSSH服务器的公钥与私玥均存储在/etc/ssh目录中。在OpenSSH客户端,用户收到的所有公钥,以及提供密钥的OpenSSH服务器的IP地址均存储在用户主目录下的~/.ssh/known_hosts文件中(.ssh是一个隐藏目录)。
如果密钥与IP地址不再匹配,OpenSSH将会认为某个环节出了问题。例如,重新安装操作系统或者升级OpenSSH都会导致系统再次生成新的密钥,恶意的网络攻击也会造成密钥的变动。因此,当密钥发生变化时,总是应当先了解密钥发生变化的原因,以确保网络访问期间的数据安全。
openssh服务端 //sshd,配置文件在/etc/ssh/sshd_config
openssh客户端 //ssh,配置文件在/etc/ssh/ssh_config
ssh-keygen //密钥生成器
ssh-copy-id //将公钥传输至远程服务器
scp //跨主机安全复制工具
//以当前用户身份在客户端连接服务端,结束使用exit命令
[root@pengzh ~]# ssh 192.168.207.130
The authenticity of host '192.168.207.130 (192.168.207.130)' can't be established.
ECDSA key fingerprint is SHA256:DrUgtAO+SHkDgUIhFoAY0YR1QStcN8of1lQPIi+njZA.
ECDSA key fingerprint is MD5:4d:80:5c:ee:81:58:36:2a:79:93:d8:58:20:ca:ef:7a.
Are you sure you want to continue connecting (yes/no)? yes
//当前主机第一次连接陌生主机时,会自动建立.ssh/know_hosts
Warning: Permanently added '192.168.207.130' (ECDSA) to the list of known hosts.
[email protected]'s password:
Last login: Sun Apr 26 10:01:50 2020 from 192.168.207.1
[root@localhost ~]# exit
logout
Connection to 192.168.207.130 closed.
[root@pengzh ~]#
//以其他用户身份在客户端连接服务端
[root@pengzh ~]# ssh [email protected]
[email protected]'s password:
Last login: Sun Apr 26 10:17:28 2020 from 192.168.207.129
[tom@localhost ~]$
//在客户端连接服务端,并执行一条命令
客户端:
[root@pengzh ~]# ssh [email protected] 'touch abc'
[email protected]'s password:
服务端:
[tom@localhost ~]$ ls
abc
ssh通过公钥加密的方式保持通信安全,当某一客户端你连接到服务端时,在该客户端登录前,服务端会向其发送公钥副本。这可用于为通信渠道设置安全加密,并验证客户端的服务器。
当用户第一次使用ssh连接到特定服务器时,ssh命令会在用户的~/.ssh/known_hosts文件中存储该服务器的公钥。在此之后每当用户进行连接时,客户端都会通过对比~/.ssh/known_hosts文件中的服务器条目和服务器发送的公钥,确保以服务器获得相同的公钥。
这意味着,如果服务器的公钥发生更改(由于硬盘出现故障导致公钥丢失,或者出现某些正当理由替换公钥),用户则需要更新其~/.ssh/known_hosts文件并删除旧的条目才能够进行登录。
//主机ID存储在本地客户端上的~/.ssh/known_hosts文件中
[root@pengzh ~]# cat .ssh/known_hosts
192.168.207.130 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHIFrCe7DFrSz0aZY2brLp0M2bgPPatPx+rbKBdSWGJUQ3DFTxs8W2ZV+dEuutD+M2WsVoVTBSqCIFO7ivtVv/k=
//主机密钥存储在SSH服务端上的/etc/ssh/ssh_host_key*文件中
[root@pengzh ~]# ls /etc/ssh/*key*
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub
使用ssh-keygen
命令生成密码。将会生成私钥~/.ssh/id_rsa
和公钥~/.ssh/id_rsa.pub
//-t可以指定加密方式
[root@pengzh ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): //输入要保存密钥的文件,默认为(/root/.ssh/id_rsa)
Enter passphrase (empty for no passphrase): //输入密码(空表示没有密码)
Enter same passphrase again: //再次输入相同密码
Your identification has been saved in /root/.ssh/id_rsa. //您的标识已保存在/root/.ssh/id_rsa中。
Your public key has been saved in /root/.ssh/id_rsa.pub. //您的公钥已保存在/root/.ssh/id_rsa.pub中。
The key fingerprint is:
SHA256:h7OdWCP32nQAKUHCc+Rvg4hZBW8jfzaYpAyeawlN154 root@pengzh
The key's randomart image is:
+---[RSA 2048]----+
| .o+= |
| o*.. . |
| o +oO o |
| + O O X . |
| . * + E % . |
| . o & * . |
| + o o o . |
| . + . |
| . . |
+----[SHA256]-----+
注意:
生成密钥时,系统将提供指定密码的选项,在访问私钥时必须提供该密码。如果私钥被盗,除设置者之外的其他任何人很难使用该私钥,因为已使用密码对其进行保护。这样,在攻击者破解并使用私钥前,会有足够的时间生成新的密钥,并删除所有涉及旧密钥的内容。
生成ssh密钥后,密钥将默认存储在家目录下的.ssh/目录中。私钥和公钥的权限分别为600
和644
。.ssh
目录权限必须是700
。
[root@pengzh ~]# ls .ssh
id_rsa id_rsa.pub known_hosts
[root@pengzh ~]# ll .ssh
total 12
-rw-------. 1 root root 1766 Apr 26 19:02 id_rsa
-rw-r--r--. 1 root root 393 Apr 26 19:02 id_rsa.pub
-rw-r--r--. 1 root root 177 Apr 26 18:10 known_hosts
[root@pengzh ~]# ll -d .ssh
drwx------. 2 root root 57 Apr 26 19:02 .ssh
需要将公钥复制到目标系统上时,可以使用ssh-copy-id
命令
//-i指定需要复制的公钥
[root@pengzh ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
/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
[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.
使用ssh命令登录远程主机
[root@pengzh ~]# ssh [email protected]
Last login: Sun Apr 26 11:12:24 2020 from 192.168.207.129
[root@localhost ~]#
使用scp命令传送文件到远程主机
客户端:
[root@pengzh ~]# scp abc [email protected]:/tmp
abc 100% 18 1.2KB/s 00:00
服务端:
[root@localhost ~]# ls /tmp
abc
使用scp命令从远程主机上下载文件到本地
[root@pengzh ~]# scp [email protected]:~/anaconda-ks.cfg .
anaconda-ks.cf 100% 1451 53.2KB/s 00:00
[root@pengzh ~]# ls
abc anaconda-ks.cfg text
scp命令常用选项
-r 递归复制
-p 指定端口
-q 静默模式
-a 全部复制
可以在配置文件/etc/ssh/sshd_config
中修改OpenSSH
服务器的各个方面
Port 22 //设置端口号,默认为22
ListenAddress 0.0.0.0 //设置监听的IP地址
PermitRootLogin yes //是否允许root用户远程登录系统
PermitRootLogin without-password //仅允许root用户基于密钥方式远程登录
PasswordAuthentication {yes|no} //是否启动密码身份验证,默认开启
运行此脚本前,需要先创建一个文件(此文件需和脚本放在同一个目录中),文件中写入要登录主机的信息,格式为IP:USERNAME:PASSWD
,例192.168.207.132:root:123
,当有多个主机需要免密登录时,文件中每一行为一个主机的信息。
#!/bin/bash
yum -y install expect
if [ ! -f ~/.ssh/id_rsa ];then
/usr/bin/expect <<EOF
spawn ssh-keygen -t rsa
expect {
"(*id_rsa):" { send "\r";exp_continue }
"(*passphrase):" { send "\r";exp_continue }
"*again:" { send "\r" }
}
expect eof
EOF
fi
function ssh(){
/usr/bin/expect <<EOF
spawn ssh-copy-id $1@$2
expect {
"*(yes/no)?" {send "yes\r";exp_continue}
"*password:" {send "$3\r"}
}
expect eof
EOF
}
for info in $(cat test/info);do
user=$(echo $info|awk -F: '{print $2}')
passwd=$(echo $info|awk -F: '{print $3}')
ip=$(echo $info|awk -F: '{print $1}')
ssh $user $ip $passwd
done