目录
ssh服务
ssh: secure shell protocol, 22/tcp, 安全的远程登录,实现加密通信,代替传统的 telnet 协议
[root@anolis-31 ~]$whereis ssh
ssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1.gz
[root@anolis-31 ~]$rpm -qf /usr/bin/ssh
openssh-clients-8.0p1-20.0.1.an8.x86_64
公钥交换原理
客户端:发起链接请求
服务端:返回自己的公钥,以及一个会话ID
客户端:生成密钥对
客户端:用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
客户端:发送加密后的值到服务端,服务端用私钥解密,得到Res
服务端:用解密后的值Res异或会话ID,计算出客户端的公钥
最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
/etc/ssh/sshd_config 服务端配置
/etc/ssh/ssh_config 客户端配置
当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub文件中的公钥到客户机的
~/.ssh/known_hosts中。下次连接时,会自动匹配相对应的私钥,不能匹配,将拒绝连接
常用命令,-p端口;-o StrictHostKeyChecking=no禁止首次连接的询问;
ssh [user@]host [COMMAND] [-p port] [-o option]
范例:远程主机运行本地shell脚本
[root@anolis-31 ~]$ssh 10.0.0.41 /bin/bash <echo_hostname.sh
root@10.0.0.41's password:
rocky-41
[root@anolis-31 ~]$ssh 10.0.0.41 'hostname'
root@10.0.0.41's password:
rocky-41
##加单引号,否则报错
[root@anolis-31 ~]$ssh 10.0.0.41 'echo $PS1'
root@10.0.0.41's password:
\e[34;1m[\u@\h \W]$\e[0m
范例:journalctl查看sshd日志
##使用journalctl统计日志,或-f实时刷新
[root@anolis-31 ~]$journalctl -u sshd --since "2024-06-11" >sshd.log
##后续可以考虑日志定时搜索将多次失败的IP封禁
[root@anolis-31 ~]$grep 'Failed password' sshd.log
6月 28 13:03:22 anolis-31 sshd[29647]: Failed password for root from 10.0.0.41 port 35674 ssh2
6月 28 13:05:55 anolis-31 sshd[29662]: Failed password for root from 10.0.0.41 port 45282 ssh2
范例:scp/rsync命令同步目录
##scp/rsync [options] [user@]host1:/sourcetpath [user@]host2:/destpath
##scp拷贝本机或远程文件,-r 递归复制
##rsync基于增量数据同步,即只复制两方不同的文件
##rsync包,通信两端主机都需要安装rsync,-a 存档模式什么都有;-v进度;
##--delete 源数据删除,目标数据也自动同步删除
##rsync -av /etc server1:/tmp/ #复制目录和目录下文件
##rsync -av /etc/ server1:/tmp/ #只复制目录下文件
##31、41创建目录
[root@anolis-31 ~]$mkdir /data
[root@anolis-31 ~]$cp -a /etc /data/
[root@anolis-31 ~]$ll /data/etc/ -rt --time-style=long-iso | tail -1
-rw-r--r-- 1 root root 14559 2024-06-28 10:48 ld.so.cache
[root@rocky-41 ~]$mkdir /data
##31同步,同步后查看对应文件,文件时间都一样
[root@anolis-31 ~]$rsync -a /data/ 10.0.0.41:/data
root@10.0.0.41's password:
[root@rocky-41 ~]$ll /data/etc/ -rt --time-style=long-iso | tail -1
-rw-r--r-- 1 root root 14559 2024-06-28 10:48 ld.so.cache
##修改文件后同步
[root@anolis-31 ~]$mv /data/etc/ld.so.cache /data/etc/ld.so.cache.mod
[root@anolis-31 ~]$rsync -a /data/ 10.0.0.41:/data
root@10.0.0.41's password:
##41出现两个文件,没有加--delete增量同步
[root@rocky-41 ~]$ll /data/etc/ld.so.cache*
-rw-r--r-- 1 root root 14559 Jun 28 2024 /data/etc/ld.so.cache
-rw-r--r-- 1 root root 14559 Jun 28 2024 /data/etc/ld.so.cache.mod
##-v显示详细信息,--delete源目录无,则删除,保证一致性,可看到本次增量同步
[root@anolis-31 ~]$rsync -av --delete /data/ 10.0.0.41:/data
root@10.0.0.41's password:
sending incremental file list
deleting etc/ld.so.cache
etc/hostname.conf
sent 26,785 bytes received 311 bytes 10,838.40 bytes/sec
total size is 25,044,413 speedup is 924.28
##41进行验证
[root@rocky-41 ~]$ll /data/etc/ld.so.cache*
-rw-r--r-- 1 root root 14559 Jun 28 2024 /data/etc/ld.so.cache.mod
范例:手动ssh实现局域网key验证
##背景:实现将局域网10.0.0.31、41、43,使用root账户能直接ssh登录,不需要任何交互,便于后续自动化运维脚本的执行。
##原理:将公私钥和登录权限文件共享给指定用户root的ssh目录。
##ssh客户端配置修改首次登录不提醒,31、41、43都修改
##新增一项
[root@anolis31 ~]$sed -i.bak '/StrictHostKeyChecking/a\StrictHostKeyChecking no' /etc/ssh/ssh_config
[root@anolis31 ~]$grep StrictHostKeyChecking /etc/ssh/ssh_config
# StrictHostKeyChecking ask
StrictHostKeyChecking no
##sshd服务端配置修改key验证,31、41、43都修改
[root@anolis31 ~]$sed -i.bak 's/#PubkeyAuthentication/PubkeyAuthentication/' /etc/ssh/sshd_config
##可以考虑将密码验证关闭
[root@anolis31 ~]$grep '^PasswordAuthentication' /etc/ssh/sshd_config
PasswordAuthentication yes
##在31生成共用的公私钥的密码文件
##直接回车默认路径默认文件空密码
[root@anolis31 ~]$cd .ssh/
[root@anolis31 .ssh]$ssh-keygen
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:c84smyLygn162AWMGgsYSaxYr3x7CSCr1SO2ailzY/Q root@anolis31
The key's randomart image is:
+---[RSA 3072]----+
|oo |
|o.. |
|+o + |
|B o + |
|.B + . S . |
|+ B = . * |
|.*.B = .. + |
|=oX E + + |
|+=.O.o .o |
+----[SHA256]-----+
##将公钥写入到管理密码登录权限的文件(authorized_keys)
[root@anolis31 .ssh]$cat id_rsa.pub >> authorized_keys
##只要把三个文件(id_rsa、id_rsa.pub、authorized_keys),私钥公钥和密码登录文件拷贝即可,首次需要输入密码,以后就不需要了
[root@anolis31 .ssh]$scp * 10.0.0.41:/root/.ssh/
[root@anolis31 .ssh]$scp * 10.0.0.43:/root/.ssh/
范例:脚本实现ssh局域网key验证
[root@rocky31 ~]$cat ssh_all.sh
#!/bin/bash
set -o nounset
set -o errexit
ssh_password=123456
ip_list="
10.0.0.41
10.0.0.43
"
##打开本机key验证
(grep -q "^#PubkeyAuthentication yes" /etc/ssh/sshd_config) && (sed -i.bak 's/#PubkeyAuthentication/PubkeyAuthentication/' /etc/ssh/sshd_config)
##关闭本机初次登录提醒
sed -i.bak '/StrictHostKeyChecking/a\StrictHostKeyChecking no' /etc/ssh/ssh_config
##判断是否生成公私钥,是否生成密码文件
[ ! -f /root/.ssh/id_rsa ] && ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null
##id_rsa.pub文件生成较慢,等待30秒
try_time=1
while [ ! -f /root/.ssh/id_rsa.pub ];do
sleep 10
echo "hello"
if [ $try_time -ge 3 ];then
echo "id_rsa.pub文件未创建"
exit 1
fi
((try_time++))
done
[ ! -f /root/.ssh/authorized_keys ] && cat /root/.ssh/id_rsa.pub>>/root/.ssh/authorized_keys
##Expect是一个自动化交互式应用程序的工具,无则安装
rpm -q expect &> /dev/null || yum -y -q install expect &> /dev/null
##读ip列表,进行公私钥及密码文件拷贝
for ip in $ip_list;do
{
##调用expect
expect<<EOF
##set设置超时
set timeout 10
##spawn启动一个新进程,同步root的.ssh目录下文件
spawn rsync -a --delete /root/.ssh/ $ip:/root/.ssh
##如果看到yes/no字符串,输入yes后继续,password则发送密码继续;如果遇到文件结束符eof,退出
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$ssh_password\r"}
}
expect eof
EOF
##打开key验证
(grep -q "^#PubkeyAuthentication yes" /etc/ssh/sshd_config) && (sed -i.bak 's/#PubkeyAuthentication/PubkeyAuthentication/' /etc/ssh/sshd_config)
echo "$ip is done"
##&后台并行执行
}&
done
wait
echo "all done"
标签:服务,##,data,31,etc,ssh,root
From: https://www.cnblogs.com/szlhwei/p/18278800