ssh常见的两种登陆方式:
1、SEO靠我密码登陆
2、密钥登陆(免密码登录)# ssh选项-l 指定登陆的用户名-p 指定server的端口-i 指定私钥文件,默认会在~/.ssh/去找私钥-o 接特定设置选项 # 无需输入ySEO靠我es,自动保存hostkey ssh -o StrictHostKeyChecking=no 192.168.0.132 -p 223 远程Shell应用程序 SEO靠我 允许用户在远程机器上执行任意命令 让标准输出在本地 早期明文远程协议:telnetSSH基于公钥加密(非对称加密)技术。
数据加密传输。客户端和服务器的SEO靠我身份验证。#查看ssh服务是否启动 [root@sanchuang ~]# ps -ef |grep ssh # 查看进程 [root@sanchuang ~]# piSEO靠我dof sshd # 查看某个进程是否有pid 2742 2736 867pidof命令用于查找指定名称的进程的进程号id号
-s:仅返回一个进程号;
-c:仅显示具有相同“root”目录SEO靠我的进程;
-x:显示由脚本开启的进程;
-o:指定不显示的进程ID。[root@sanchuang ~]# netstat -aptln |grep ssh # 查看网络连接监听状态 tcSEO靠我p 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 867/sshd tcp 0 36 192.168.49.135:22 192.168.49.1:51429 ESTSEO靠我ABLISHED 2736/sshd: root [pr tcp6 0 0 :::22 :::* LISTEN 867/sshd #0.0.0.0:22表示在本机所有iSEO靠我p上监听22端口 #0.0.0.0:* 表示允许任意ip,任意端口客户端来连接 [root@sanchuang ~]# lsof -i:22 # list open SEO靠我file 列出打开的文件(全称),知道端口后可以查看具体端口 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssSEO靠我hd 867 root 5u IPv4 25177 0t0 TCP *:ssh (LISTEN) sshd 867 root 7u IPv6 25185 0t0 TCP *:ssh (SEO靠我LISTEN) sshd 2736 root 5u IPv4 90178 0t0 TCP sanchuang:ssh->192.168.49.1:51429 (ESTABLISHED)SEO靠我 sshd 2742 root 5u IPv4 90178 0t0 TCP sanchuang:ssh->192.168.49.1:51429 (ESTABLISHED) SEO靠我 #查看命令属于哪个包 [root@sanchuang ~]# which netstat #找到命令的绝对路径 /usr/bin/netstat SEO靠我[root@sanchuang ~]# rpm -qf /usr/bin/netstat #查看这个绝对路径执行文件属于哪个包 net-tools-2.0-0.51.20160912gSEO靠我it.el8.x86_64加解密的钥匙是同一把。
- a机器给SEO靠我b机器传输东西,a机器知道一串密码叫做aa,b机器也知道这个密码叫做aa; - a机器对数据用aa加密,b机器用aa解密。 - 2个加密解密都用同一个密钥(加密的钥匙ASEO靠我和B都知道)。形成的条件是a和b都知道密钥是什么,且都一样 #注:问题 很难保证这个密钥不被泄漏。生成一对公私钥,私钥自己保管,公钥可以给其他人。
公私钥对是成对存在的,一SEO靠我个用于加密,一个用于解密。具体哪个为私钥,哪个为公钥就看使用者自己管理。- a机器和b机器进行数据加密传输(进行通讯)。 - a机器在本地生成1个public和private的钥匙对,SEO靠我a机器生成公钥和私钥都放在a机器上. - 发送数据时,a机器先把公钥给b(也可以把公钥给c,公钥可以给任何人), 但是私钥只有自己a机器才知道。 - b机器用a机器给的SEO靠我公钥加密,a机器收到后用私钥解密生成一对公私钥,私钥自己保管,公钥可以给其他人。
公私钥对是成对存在的,一个用于加密,一个用于解密。
具体哪个为私钥,哪个为公钥就看使用者自己管理。注意:
使用公钥进行加密,SEO靠我私钥解密,基本用于数据加密(eg:密码登录)
使用私钥加密公钥解密,用于认证(eg:公钥认证即免密登录)优点:速度快;
缺点:维护困难、安全性得不到保障;非对称加密:优点:易于维护;
缺点SEO靠我:计算量大,占用资源;
对于私钥加密的内容,如果黑客拿到了公钥,很容易获取其中信息;使用公钥进行加密,私钥解密,用于数据加密 使用私钥进行加密,公钥解密,用于认证——公钥认证/免密码登录/密钥SEO靠我登录
实验步骤
1、在A机器上生成生成公私钥对(如果有公私钥对,则不需要重新生成),默认会放在当前用户家目录下的.ssh/文件下。
== 登陆时默认会去寻找家目录下的~/.ssSEO靠我h/id_rsa去进行验证,所以尽量不要在生成key的时候将它的默认路径更改。==[root@mysql ~]# ssh-keygen #生成,中间一直敲回车,选择默认 GeneratSEO靠我ing public/private rsa key pair. # 生成公私钥对,采用rsa算法 Enter file in which to save the key (/rootSEO靠我/.ssh/id_rsa): # 保存在/root/.ssh/id_rsa Created directory /root/.ssh. Enter passphraseSEO靠我 (empty for no passphrase): # 输入密码(为空,表示没有密码) 生成一个id_rsa(私钥)id_rsa.pub(公钥)Your identificatiSEO靠我on has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.SEO靠我pub.2、在B机器上目标用户的家目录下面~/.ssh/authorized_keys文件里将A机器的公钥复制粘贴过来,没有此文件就创建,修改文件权限为600
[root@MYSQL ~]# ll -aSEO靠我 .ssh -d drwxr-xr-x 2 root root 29 5月 2 09:20 .ssh #.ssh权限默认755.这里不能为777 [root@MYSQLSEO靠我 .ssh]# ll 总用量 4 -rw-r--r-- 1 root root 564 5月 2 09:20 authorized_keys [rootSEO靠我@MYSQL .ssh]# chmod 600 authorized_keys [root@MYSQL .ssh]# ll # 修改权限,只允许属主有读写权限,属组和其他用户均无权限 SEO靠我 总用量 4 -rw------- 1 root root 564 5月 2 09:20 authorized_keys3、查看公钥认证是否成功
在A机器上执行 ssh rSEO靠我oot@B机器的ip
不需要输入密码就可以登陆到B机器,则表示免密码登陆成功[root@mysql .ssh]# ssh root@192.168.169.138 Last login:SEO靠我 Mon May 2 05:42:06 2022 from 192.168.169.1 或者 [root@mysql .ssh]# ssh 192.168.169.13SEO靠我8 -l root Last login: Mon May 2 09:27:28 2022 from 192.168.169.137 # ssh -vvv ... 查看SEO靠我登陆过程详细信息 # ssh 192.168.169.138 不接任何用户名,会默认以当前A机器所在用户登陆B机器同名的用户,不管B机器有没有这个用户 [root@LSEO靠我B-1 .ssh]# ssh 192.168.169.137 # 端口默认是22的可以登录 ssh: connect to host 192.168.169.137 port 22: SEO靠我Connection refused [root@LB-1 .ssh]# ssh 192.168.169.137 -p2233 # 如果改了端口,要指定端口才能登录,此时回车不需要输入SEO靠我密码或者
直接按下一步后完成。
复制公钥
进入登录用户的家目录,将复制的公钥放到.ssh/authorized_key这里(没有就创建)保存。
堡垒机需要配置防火墙
禁止root用户登录
禁止密码登录
添加一些防火SEO靠我墙
创建专门管理员的用户、sudo的权限公钥认证排错
1、确保公钥正确
2、确保~/.ssh/authorized_keys文件权限为600
3、确保家目录以及.ssh目录权限为755以下权限,即属组和其他人SEO靠我没有7的权限[root@sanchuang .ssh]# su - wy su切换用户,是不会经过ssh su 和 su - su切换不会切换bash环境,su - 会SEO靠我切换到wy的bash环境登陆方式
[root@mysql-binary .ssh]# ssh wy@192.168.0.35 Last failed login: Sat Nov 14 SEO靠我09:59:11 CST 2020 from 192.168.0.132 on ssh:notty There were 2 failed login attempts since tSEO靠我he last successful login. Last login: Sat Nov 14 09:53:11 2020 from 192.168.0.132 [wSEO靠我y@mysql-rpm ~]$ 登出 Connection to 192.168.0.35 closed. [root@mysql-binary .ssh]# sshSEO靠我 192.168.0.35 -l wy Last login: Sat Nov 14 10:01:28 2020 from 192.168.0.132 #######查SEO靠我看登陆过程详细信息 [root@mysql-binary .ssh]# ssh -vvv 192.168.0.35 wy ... debug1: Trying privSEO靠我ate key: /home/sanchuang/.ssh/id_rsa debug3: no such identity: /home/sanchuang/.ssh/id_rsa: SEO靠我No such file or directory debug1: Trying private key: /home/sanchuang/.ssh/id_dsa deSEO靠我bug3: no such identity: /home/sanchuang/.ssh/id_dsa: No such file or directory debug1: TryinSEO靠我g private key: /home/sanchuang/.ssh/id_ecdsa debug3: no such identity: /home/sanchuang/.ssh/SEO靠我id_ecdsa: No such file or directory debug1: Trying private key: /home/sanchuang/.ssh/id_ed25SEO靠我519 debug3: no such identity: /home/sanchuang/.ssh/id_ed25519: No such file or directory SEO靠我 ...默认会去寻找~/.ssh/id_rsa,然后再找id_dsa等等。。。。 rsa dsa ecdsa 加密算法 [root@mysql-binary SEO靠我.ssh]# ssh 192.168.0.35 -l wy -p 22 #指定用户,指定端口 Last login: Sat Nov 14 10:01:37 2020 from 192SEO靠我.168.0.132[sanchuang@mysql-binary ~]$ ssh 192.168.0.35 #不接任何用户名,会默认以当前A机器所在用户登陆B机器同名的用户,不管B机器有没有这个用户SEO靠我 sanchuang@192.168.0.35s password:这个流程有一个问题, 怎么保证收到的公钥就是目标servSEO靠我er的公钥?(中间人攻击)
如果一个攻击者中途拦截了client的登陆请求, 发送自己的公钥给client,client端就会用攻击者的公钥进行数据加密 攻击者接收到信息SEO靠我后,用自己的私钥就可以解密了,这就窃取了client的登陆信息了。 [sanchuang@mysql-binary .ssh]$ ssh 192.168.0.35 TSEO靠我he authenticity of host 192.168.0.35 (192.168.0.35) cant be established. ECDSA key fingerpriSEO靠我nt is SHA256:6V02tsAzBmVJ7yEbppVkISnSEyvf+HFWbzDbIPwmG84. ECDSA key fingerprint is MD5:6c:bdSEO靠我:a9:37:af:ba:f1:53:dd:c8:d2:d9:16:44:c9:9e. Are you sure you want to continue connecting (yeSEO靠我s/no)? 为了解决这个问题,client端第一次登陆的时候,会进行一个登陆公钥确认。 确认server服务端的这个host主机摘要,确认成功之后就会将serverSEO靠我端的pubkey保存在~/.ssh/known_hosts里面 以后每次连接都会验证这个know_hosts里的key和收到的pubkey是否一致。 [root@loSEO靠我calhost .ssh]# ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub # 查看公钥指纹 3072 SHA256:+onwII3kw6nSEO靠我oYzHjxfO+8cx1Yj0BhKosqMbvK3Jutz8 no comment (RSA) # server主机的pubkey保存在/etc/ssh/目录下,默认使用 sshSEO靠我_host_ecdsa_key.pub [root@mysql-rpm ssh]# cd /etc/ssh [root@mysql-rpm ssh]# ls SEO靠我 moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub sSEO靠我sh_config ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_keyclient端生成公钥对,将公SEO靠我钥追加在server端的~/.ssh/authorized_keys发送登陆请求,server收到请求之后,生成随机字符串发送给clientclient用自己的私钥对字符串进行加密,发送给serverSEO靠我。server收到加密字符串之后用公钥解密,比较解密出的字符串和之前生成的字符串事发后一致。返回结果给client
OpenSSH
官方站点:http://www.openssh.com
主要软件包SEO靠我:openssh-server、openssh-clients服务名:sshd 服务端主程序:/usr/sbin/sshd 客户端主程序:/usr/bin/ssh SEO靠我 服务端配置文件:/etc/ssh/sshd_config 客户端配置文件:/etc/ssh/ssh_config #查看命令属于哪个包下载的 SEO靠我 [sanchuang@mysql-binary ssh]$ which ssh /bin/ssh [sanchuang@mysql-binary ssh]$ rpmSEO靠我 -qf /bin/ssh openssh-clients-7.4p1-21.el7.x86_64 [root@mysql-binary ~]# rpm -qf /usSEO靠我r/sbin/sshd openssh-server-7.4p1-21.el7.x86_64服务端的配置文件,修改配置文件,要重新加载。
[root@mysql-bSEO靠我inary ssh]# kill -HUP 23380 [root@mysql-binary ssh]# kill -1 23380 [root@mysql-binarSEO靠我y ssh]# service sshd restart Redirecting to /bin/systemctl restart sshd.service [rooSEO靠我t@mysql-binary ssh]# service sshd reload Redirecting to /bin/systemctl reload sshd.service SEO靠我 [root@mysql-rpm .ssh]# man ssh [root@mysql-rpm .ssh]# man 5 /etc/ssh/sshd_config #查看配SEO靠我置文件帮助文档配置详解
Port 2233 #修改默认监听端口(默认22端口) #AddressFamily any ListenAddress 192.168.0.13SEO靠我2 #设置本机监听ip地址,默认为0.0.0.0(表示在本机任意ip地址上监听) PermitRootLogin no #不允许root用户登陆,默认为yes PubkSEO靠我eyAuthentication yes #是否开启公钥认证 AuthorizedKeysFile .ssh/authorized_keys #配置公钥认证的文件 PaSEO靠我sswordAuthentication no #是否开启密码认证,默认为yes UsePAM yes #使用pam认证 #pam认证模块 --》配置路径/etc/paSEO靠我m.d 这个目录下面存放的是每个需要认证的服务的配置,文件名就是服务名 UseDNS yes # 是否将客户端主机名解析为ip#此过程不顺利的话,会非常的慢,会影响登陆认证的速度,可以SEO靠我将其设置为no管理密钥 一个代理程序,帮助我们管理私钥。
配置方法: xshell–> 主机属性–》ssh --》勾选 使用xagent进行身份验证 勾选使用代理转发[sanchuangSEO靠我@mysql-binary .ssh]$ ssh-add id_rsa #添加主机密钥给agent管理 [sanchuang@mysql-binary .ssh]$ ssh-add -SEO靠我l #查看agent管理了哪些密钥修改客户端配置,配置文件: ~/.ssh/config
[SEO靠我sanchuang@a ~]$ cat .ssh/config ############################## ForwardAgent yes SEO靠我 StrictHostKeyChecking no # 注:是否输入yes ServerAliveInterval 60 # 注:存活时间 IdentityFilSEO靠我e ~/.ssh/id_rsa # 注:认证文件 ############################# Host BHostName 192.168.0.39UsSEO靠我er sanchuangPort 2233Host 10.*User sanchuangPort 2233ProxyCommand ssh 192.168.0.39 -W %h:%p -l sanchSEO靠我uang -p 2233 # 提示主机不被信任 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 将~/.ssh/knSEO靠我own_hosts 删掉传输文件
# 将a机器的文件传输到b机器的/root目录下,不接路径直接放到家目录下 [rooSEO靠我t@LB-1 ~]# scp -P 2233 install_kafka_4.sh root@192.168.169.137:/root [root@a ~]# scp ahost B:/tmp # SEO靠我注:将A机器 当前路径ahost文件cp到B机器下的/tmp路径下 [root@a ~]# scp B:/tmp/bhost ./ # 注:将B机器 /tmp/bhost文件cp到当前SEO靠我路径 [root@a ~]# scp B:tmp/testhost ./ # 注:将B机器 家目录下 tmp/testhost文件cp到当前路径传输目录
[root@a ~]# scp SEO靠我-r adir B: # 注:将A机器当前路径下 adir文件夹 cp到B机器家目录下 [root@a ~]# scp -r adir B:bdir # 注:复制文件夹并改名 SEO靠我 [root@a ~]# scp -r adir B:bdir/ # 注:和上面的没有区别ftp和sftp区别
FTP是一种文件传输协议,一般是为了方便数据共享的。
包括一个FTP服SEO靠我务器和多个FTP客户端。
FTP客户端通过FTP协议在服务器上下载资源。SFTP协议是在FTP的基础上对数据进行加密,使得传输的数据相对来说更安全。
但是这种安全是以牺牲效率为代价的,也就是说SFTP的传SEO靠我输效率比FTP要低。 #注:ftp文件传输 #注:sftp 传输文件 本地和异地传输文件 #注:格式 sftp 用户名@主机名 [sanSEO靠我chuang@a ~]$ sftp B Connected to B. sftp> get bdir # 获得一个文件 Fetching /home/sSEO靠我anchuang/bdir/ to bdir Cannot download non-regular file: /home/sanchuang/bdir/ sftp>SEO靠我 mget bdir # 一次获得多个文件 Fetching /home/sanchuang/bdir/ to bdir Cannot download non-regSEO靠我ular file: /home/sanchuang/bdir/ sftp> exit批量执行命令pssh
[root@a ~]# pssh -h ip.txSEO靠我t -i "/usr/sbin/ip a" #ip.txt里面可以这样写 [root@a ~]# cat ip.txt 192.168.0.31:223SEO靠我3 192.168.0.54:22 ... [root@a ~]# vim ip.txt sanchuang@192.168.0.31:SEO靠我2233 sanchuang@192.168.0.54:2233批量传输文件pscp.pssh
[sanchuang@a ~]$ pscp.pssh -h ip.txt pscptestSEO靠我 /tmp #把当前目录下的pscptest文件传送到目标主机的/tmp目录下 [1] 17:37:21 [SUCCESS] sanchuang@192.168.0.48:2233 SEO靠我 [2] 17:37:22 [SUCCESS] sanchuang@192.168.0.39:2233批量ping 使用
[root@a ~]# yum install fpiSEO靠我ng -y [root@a ~]# fping -g 192.168.0.1/24 # 注:-g 根据网段去ping 192.168.0.1 is alive SEO靠我 …… 192.168.0.254 is unreachable [root@a ~]# fping -f ip.txt # 注:-f根据文件指定ip去ping SEO靠我 192.168.0.31 is alive 192.168.0.54 is alive [root@a ~]# vim ip.txt 1SEO靠我92.168.0.31 192.168.0.54SSH使用TCP Wrappers实现访问控制
主要配置文件 /etc/hosts.allow /SEO靠我etc/hosts.deny # 不需要重启服务,有守护进程帮它控制 [root@cPen_A ~]# vim /etc/hosts.deny sshdSEO靠我:192.168.0.31 #注:访问控制,拒绝192.168.0.31 不需要重启服务,有守护进程帮它控制 #注:主机公钥在 /etc/ssh/下面 默认使用ecdsSEO靠我a模式 #注:known_hosts文件里有什么 前面是ip地址,后面是公钥 #注:authorized_keys 放受信任的公钥TCP Wrappers可以控制哪些服SEO靠我务
受super daemon(xinetd)管理的服务 支持libwrap.so模块的服务TCP Wrappers的访问控制原则
首先检查 hosts.allow 文件,若找到相匹配的策SEO靠我略,则允许访问 否则继续检查 hosts.deny 文件,若找到相匹配的策略,则拒绝访问 如果两个文件中都没有相匹配的策略,则允许访问SSH端口转发详解及实SEO靠我例
# 永久修改selinux [root@cPen_A ~]# vim /etc/selinux/config SELINUX=disabled # 看SEO靠我当前系统有多少连接 (establish) [root@cPen_B ~]# netstat -anplut|grep -E "ESTABLISHED|LISTEN|TIME_WAITSEO靠我"|awk -F" " {print $6}|sort|uniq -c2 ESTABLISHED2 LISTEN端口转发:A、C、B主机。主机B起了个nginx服务 端口号80;主机A不能直接访问主机SEO靠我B,但主机A可以访问主机C,主机C可以访问主机B (A–>C–>B);A可以ssh到C,A跳到C,然后访问B的80端口 (nginx)。现在 在主机C上面建立一个隧道,隧道开启15577端口连接B的8SEO靠我0端口,A去访问15577端口相当于去访问B的80映射
#注:ssh隧道 第一个用于不能直接访问的情况;第二个考虑密文传输 [root@cPen_C ~]# lsof -i:15577 SEO靠我# 注:在C主机上操作,15577端口未被占用 [root@cPen_C ~]# ssh -g -L 15577:192.168.0.39:80 sanchuang@192.168.0SEO靠我.39 -p 2233 #注:192.168.0.39 右边B主机ip地址 # 注:在C主机上开通一个隧道 端口为15577 [root@cPen_A ~]# curlSEO靠我 192.168.0.48:15577 # 注:模仿网络访问 (80端口nginx网页使用curl访问) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTMSEO靠我L 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> # 注:返回的内容 #注:192.168.0.48 中间C主机ipSEO靠我地址 # 注:注意防火墙 iptables -F #注:访问中间C主机的15577端口 转接成右边B主机的80端口 #注:注意 不能绑定到本地的回环地址 127.0.0SEO靠我.1 只能访问自己 (所以 -g) -g作用 本地所有ip都是访问 #注:- L是本地端口转发 #注:一般可以开启65535个端口网站备案号:浙ICP备17034767号-2