ssh-keygen产生公钥与私钥对,及密钥分发,ssh远程执行常用命令方法,和如何防止SSH登录入侵或被破解

前言 

SSH是安全的加密协议,用于远程连接Linux服务器,默认端口是22,安全协议版本是SSH2 。

SSH原理

SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。

ssh服务端由2部分组成: openssh(提供ssh服务)、openssl(提供加密的程序),主要功能是提供SSH连接和作为SFTP服务器。

ssh的客户端:包含ssh连接命令远程拷贝scp命令等,可以用 XSHELL,Securecrt, Mobaxterm等工具进行连接。

SSH的工作机制 

服务器启动的时候,自己产生一个密钥(768bit公钥),本地的ssh客户端,发送连接请求到ssh服务器服务器检查连接点客户端发送的数据和IP地址,确认合法后,发送密钥(768bits)给客户端,此时客户端将本地私钥(256bit),和服务器的公钥(768bit),结合成密钥对key(1024bit),发回给服务器端,建立连接,通过key-pair数据传输。       

SSH的加密技术

加密技术:传输过程,数据加密。            

  • SSH1没有对客户端的秘钥进行校验,很容易被植入恶意代码
  • SSH2增加了一个确认联机正确性的Diffe_Hellman机制,每次数据的传输,Server都会检查数据来源的正确性,避免黑客入侵。                   

SSH2支持RSA和DSA密钥   

  • DSA:digital signature Algorithm  数字签名
  • RSA:既可以数字签名又可以加密 

ssh-keygen产生公钥与私钥对

ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利。

第一步:在本地机器上使用ssh-keygen产生公钥私钥对

azdebug_it@azdebug_it:~/$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/azdebug_it/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): [Press enter key
same passphrase again: [Pess enter key]
Your identification has been saved in /home/azdebug_it/.ssh/id_rsa.
Your public key has been saved in /home/azdebug_it/.ssh/id_rsa.pub.
The key fingerprint is:

用cat命令查看是否生成产生公钥私钥对

azdebug_it@azdebug_it:~$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCl9N5+xboqSIagBx02rdZ2fkROCPW8iW7hl6Gu+2hkBYYy/b1qcOm8RF/AMyas3i0QEK7Hcu9H51l2lulVbS5n9M9FaWIyYzssaS012x2mg9iA6MxPMlaXFsZ5jnVrGicndzf3VUu9kCErp5q0OzzMjsG3PKQevzWZJSBaFgc8NF5ZJ+VT54BN8ktMTHVwOo15I2Uai+bs4eP0NsuwIJmGyYIUOuvTuUtJxGV3hZ+tcjhupupqVCwYOE+cDz8VkFBGtnKsdE69hWoY2VUfEOAfHZptra7Ce9dXfDgx9jxuuNiJYtGo/bZDfe+UJ5HUv8wrL+hFeRIihdmP2CKJD8j5 azdebug_it@azdebug_it

第二步:用ssh-copy-id将公钥复制到远程机器中

azdebug_it@azdebug_it:~$  ssh-copy-id -i .ssh/id_rsa.pub  [email protected]

注意: ssh-copy-id 将key写到远程机器的 ~/ .ssh/authorized_key.文件中

第三步: 登录到远程机器不用输入密码

azdebug_it@azdebug_it:~$  ssh [email protected]
Last login: Sun Nov 16 17:22:33 2008 from 192.168.16.16

常见问题:

ssh-copy-id -u fleapx -i ~/fleapx/.ssh/id_rsa.pub ssh [email protected]
#第一次需要密码登录

上述是给fleapx用户,赋予无密码登陆的权利。

ssh-copy-id命令

ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,
ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。

ssh-copy-id命令可以把本地的ssh公钥文件安装到远程主机对应的账户下的authorized_keys文件中。

使用模式:

ssh-copy-id [-i [identity_file]] [user@]machine

描述:ssh-copy-id 是一个实用ssh去登陆远程服务器的脚本(假设使用一个登陆密码,因此,密码认证应该被激活,直到你已经清理了做了多个身份的使用)。
它也能够改变远程用户名的权限,如,~/.ssh和~/.ssh/authorized_keys删除群组写的权限(在其它方面,如果远程机上的sshd,在它的配置文件中是严格模式的话,这能够阻止你登陆。)。

如果这个 “-i”选项已经给出了,然后这个认证文件(默认是~/.ssh/id_rsa.pub)被使用,不管在你的ssh-agent那里是否有任何密钥。
另外,命令 “ssh-add -L” 提供任何输出,它使用这个输出优先于身份认证文件

如果给出了参数“-i”选项,或者ssh-add不产生输出,然后它使用身份认证文件的内容。一旦它有一个或者多个指纹,它使用ssh,将这些指纹填充到远程机~/.ssh/authorized_keys文件中

/usr/bin/ssh-copy-id: ERROR: No identities found

使用选项 -i ,当没有值传递的时候,或者如果 ~/.ssh/identity.pub 文件不可访问(不存在), ssh-copy-id 将显示上述的错误信息( -i选项会优先使用将ssh-add -L的内容)

ssh远程执行命令方法

复制SSH密钥目标主机开启无密码SSH登录

cd /root
ssh-keygen -t rsa
# 接下来一路回车到底
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node02
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node03

某主机的9906端口开启到本地主机3306端口的隧道

#ssh -N -L 9906:localhost:3306 [email protected]
ssh -L 9906:10.1.0.2:3306 [email protected]
ssh -f -N -L 9906:10.1.0.2:3306 [email protected]
ssh -f -N -L 10.1.0.1:9906:10.1.0.2:3306 [email protected]

现在你可以直接在浏览器中输入http://localhost:9906访问这个网站。

优秀链接:ssh端口转发:ssh隧道

将你的麦克风输出到远程计算机的扬声器

dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp

这样来自你麦克风端口的声音将在SSH目标计算机的扬声器端口输出,但遗憾的是,声音质量很差,你会听到很多嘶嘶声。

比较远程和本地文件

ssh user@host cat /path/to/remotefile | diff /path/to/localfile –

在比较本地文件和远程文件是否有差异时这个命令很管用。

通过SSH挂载目录/文件系统

sshfs name@server:/path/to/folder /path/to/mount/point

从http://fuse.sourceforge.net/sshfs.html下载sshfs,它允许你跨网络安全挂载一个目录。

通过中间主机建立SSH连接

ssh -t reachable_host ssh unreachable_host

Unreachable_host表示从本地网络无法直接访问的主机,但可以从reachable_host所在网络访问,这个命令通过到reachable_host的“隐藏”连接,创建起到unreachable_host的连接

直接连接到只能通过主机B连接的主机A

ssh -t hostA ssh hostB

当然,你要能访问主机A才行。

创建到目标主机的持久化连接

ssh -MNf <user>@<host>

在后台创建到目标主机持久化连接,将这个命令和你~/.ssh/config中的配置结合使用:

Host host
ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster no



所有到目标主机的SSH连接,都将使用持久化SSH套接字,如果你使用SSH定期同步文件(使用rsync/sftp/cvs/svn),这个命令将非常有用,因为每次打开一个SSH连接时,不会创建新的套接字

通过SSH连接屏幕

ssh -t remote_host screen –r
laptop> ssh server.com screen -ls
#它会显示在server.com上可用的屏幕列表像这样[1]:
123.foo
456.bar
#登录到server.com并做
screen -S foo
#然后再不再注销该会话。
#要从别处重新连接,请执行
ssh -t server.com screen -dr foo
#要列出可用屏幕以进行重新对比:
screen -ls
#或者,当然,
ssh server.com screen -ls

直接连接到远程屏幕会话(节省了无用的父bash进程)。

端口检测(敲门)

knock <host> 3000 4000 5000 && ssh -p <port> user@host && knock <host> 5000 4000 3000

在一个端口上,敲一下,打开某个服务的端口(如SSH),再敲一下关闭该端口,需要先安装knockd,下面是一个配置文件示例。

[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 3000,4000,5000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 5000,4000,3000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn

清除原有旧ssh密钥方法

#ssh-keygen -R <the_offending_host>
#比如我们要将 的公钥信息清除,使用命令(请自己将 替换成自己的IP或域名):
ssh-keygen -f  "/root/.ssh/known_hosts" -R 192.168.0.1
#其中 -f filename     指定密钥文件名。
#     -R hostname   从 known_hosts 文件中删除所有属于 hostname 的密钥。

在这种情况下,最好使用专业的工具

通过SSH运行,执行复杂的远程shell命令

ssh 172.16.8.33 -l user $(<cmd.txt)
#更具移植性的版本:
ssh 172.16.8.33 -l user “`cat cmd.txt`”
ssh 172.16.8.33 -l root

替代方案:使用expect+bash shell,在ssshHost.sh脚本中封装expect的ssh登录自动填充密码功能。

  1. 使用expect的自动填充密码功能+interact交互功能。
  2. 将(hostIp, connectionStr)写入配置文本或者直接在shell脚本作为字典。
  3. shell读取用户输入hostIp,匹配出connectionStr,调用expect进行ssh登录,相关操作完成后ctrl+d退出。

通过SSH将MySQL数据库复制到新服务器(迁移数据库最快的方法)

mysqldump –add-drop-table –extended-insert –force –log-error=error.log -uUSER -pPASS OLD_DB_NAME | ssh -C user@newhost “mysql -uUSER -pPASS NEW_DB_NAME”

通过压缩的SSH隧道,Dump一个MySQL数据库,将其作为输入传递给mysql命令,迁移数据库新服务器最快最好的方法。

删除文本文件中的一行,修复“SSH主机密钥更改”的警告

sed -i 8d ~/.ssh/known_hosts

从一台没有SSH-COPY-ID命令的主机,将你的SSH公钥复制到服务器。

cat ~/.ssh/id_rsa.pub | ssh user@machine “mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys”

如果你使用Mac OS X,或其它没有ssh-copy-id命令的*nix变种,这个命令可以将你的公钥复制到远程主机,因此你照样可以实现无密码SSH登录

实时SSH网络吞吐量测试

rpm -ivh pv-1.6.0-1.x86_64.rpm
tar -cf - --exclude=.snapshot *| pv -s $(du -sb . | awk '{print $1}') |tar -xf - -C /nas_ipr_new
yes | pv | ssh 172.16.8.13  "cat > /dev/null"

通过SSH连接到主机,显示实时的传输速度,将所有传输数据指向/dev/null,需要先安装pv。

#如果是Debian:
apt-get install pv
#如果是Fedora:
yum install pv

(可能需要启用额外的软件仓库)。

如果建立一个可以重新连接的远程GNU screen

ssh -t [email protected] /usr/bin/screen –xRR

人们总是喜欢在一个文本终端中打开许多shell,如果会话突然中断,或你按下了“Ctrl-a d”,远程主机上的shell不会受到丝毫影响,你可以重新连接,其它有用的screen命令有“Ctrl-a c”(打开新的shell)和“Ctrl-a a”(在shell之间来回切换),请访问http://aperiodic.net/screen/quick_reference阅读更多关于screen命令的快速参考。

继续SCP大文件

rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file
#它可以恢复失败的rsync命令,当你通过VPN传输大文件,如备份的数据库时这个命令非常有用,需要在两边的主机上安装rsync。
rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file local -> remote
#或
rsync –partial –progress –rsh=ssh $user@$host:$remote_file $destination_file remote -> local

通过SSH W/ WIRESHARK分析流量

ssh [email protected] ‘tshark -f “port !22″ -w -' | wireshark -k -i –
#使用tshark捕捉远程主机上的网络通信,通过SSH连接发送原始pcap数据,并在wireshark中显示,
#按下Ctrl+C将停止捕捉,但也会关闭wireshark窗口,
#可以传递一个“-c #”参数给tshark,让它只捕捉“#”指定的数据包类型,
#或通过命名管道重定向数据,而不是直接通过SSH传输给wireshark,
#建议你过滤数据包,以节约带宽,tshark可以使用tcpdump替代:
ssh [email protected] tcpdump -w – ‘port !22′ | wireshark -k -i –

保持SSH会话永久打开

autossh -M50000 -t server.example.com ‘screen -raAd mysession’

打开一个SSH会话后,让其保持永久打开,对于使用笔记本电脑的用户,如果需要在Wi-Fi热点之间切换,可以保证切换后不会丢失连接。

更稳定,更快,更强的SSH客户端

ssh -4 -C -c blowfish-cbc

强制使用IPv4,压缩数据流,使用Blowfish加密。

使用cstream控制带宽

tar -cj /backup | cstream -t 777k | ssh host ‘tar -xj -C /backup’

使用bzip压缩文件夹,然后以777k bit/s速率向远程主机传输。Cstream还有更多的功能,请访问http://www.cons.org/cracauer/cstream.html#usage了解详情,例如:

echo w00t, i’m 733+ | cstream -b1 -t2

一步将SSH公钥传输到另一台机器

ssh-keygen; ssh-copy-id user@host; ssh user@host

这个命令组合允许你无密码SSH登录,注意,如果在本地机器的~/.ssh目录下,已经有一个SSH密钥对,ssh-keygen命令生成的新密钥可能会覆盖它们,ssh-copy-id将密钥复制到远程主机,并追加到远程账号的~/.ssh/authorized_keys文件中,使用SSH连接时,如果你没有使用密钥口令,调用ssh user@host后不久就会显示远程shell。

将标准输入(stdin)复制到你的X11缓冲区

ssh user@host cat /path/to/some/file | xclip

你是否使用scp,将文件复制到工作用电脑上,以便复制其内容到电子邮件中?xclip可以帮到你,它可以将标准输入复制到X11缓冲区,你需要做的就是,点击鼠标中键粘贴缓冲区中的内容。

yum install xclip
#终端输出保存到剪切板中
ls -al | xclip

此时ls -al的输出内容,已经保存在剪切板中了,此时xclip -o可以看到剪切板的内容
但此时还不可以粘贴到终端以外的程序中,此时需要用到:

#xclip -selection c 
ls -al | xclip -selection c
#文件内容复制到剪切板中
xclip /etc/apt/sources.list
xclip -selection c /etc/apt/sources.list
#剪切板内容输出到终端
xclip -o
xclip -selection c -o
#剪切板内容输出到文件
xclip -o > ~/test.txt
xclip -selection c -o > ~/test.txt

如何防止SSH登录入侵

如何判断自己正在遭受ssh暴力破解

打开ssh的调测进行观察

ssh -vvv  [email protected]

或者ssh登录服务器后,使用lastb命令。

#首次运行lastb命令会报下的错误:

#lastb: /var/log/btmp: No such file or directory
#Perhaps this file was removed by the operator to prevent logging lastb info.
#只需建立这个不存在的文件即可。

$#touch /var/log/btmp
#使用ssh的登录失败不会记录在btmp文件中。

$#lastb | head
root ssh:notty 110.84.129.3 Tue Dec 17 06:19 - 06:19 (00:00)
root ssh:notty 110.84.129.3 Tue Dec 17 04:05 - 04:05 (00:00)
root ssh:notty 110.84.129.3 Tue Dec 17 01:52 - 01:52 (00:00)
root ssh:notty 110.84.129.3 Mon Dec 16 23:38 - 23:38 (00:00)
leonob ssh:notty 222.211.85.18 Mon Dec 16 22:18 - 22:18 (00:00)
leonob ssh:notty 222.211.85.18 Mon Dec 16 22:18 - 22:18 (00:00)
root ssh:notty 110.84.129.3 Mon Dec 16 21:25 - 21:25 (00:00)
root ssh:notty 110.84.129.3 Mon Dec 16 19:12 - 19:12 (00:00)
root ssh:notty 110.84.129.3 Mon Dec 16 17:00 - 17:00 (00:00)
admin ssh:notty 129.171.193.99 Mon Dec 16 16:52 - 16:52 (00:00)

命令会显示最近错误登录的日志,包括通过ssh服务错误登录的日志,如果得到和上方显示差不多的情况,出现大量的输出,说明你的服务器,正在遭受黑客们的暴力破解。

如何防范暴力破解

修改远程登录端口

修改/etc/ssh/sshd_config文件中的Port ,将前方的#注释删除,并将22修改为你想要使用远程登录的端口,例如35678
在防火墙上添加运行端口:

iptables -I INPUT -p tcp --dport 35678 -j ACCEPT

如果您使用的ubuntu系统并使用ufw,可以使用命令:

sudo ufw allow 35678

如果您使用CentOS7系统并使用firewalld,可以使用命令:

firewall-cmd --zone=public --add-port=35678/tcp --permanent

如果是使用云服务器,云服务商有提供外部防火墙,例如阿里云的安全组的情况下,还要在外部的安全组中,修改允许tcp端口35678端口的策略。 

#最后使用
serivce sshd restart
#CentOS7用户使用
systemctl restart sshd
#重启sshd服务即可。

重启服务之后,登录服务器,都需要输入指定的远程端口,才能够登录服务器,大大降低了黑客攻击服务器的概率

限制登录IP

如果你的公司,或者常常需要登录服务器的工作网络环境,拥有固定的IP地址时,限制登录IP地址,就可以很好的保护服务器免受黑客攻击。如果没有上述的条件,我们也可以通过搭建堡垒机,将所有服务器都设置为允许堡垒机的IP地址,登录即可保护您的服务器。
操作起来相当简单,首先在/etc/hosts.allow中加入如下信息:

sshd:172.16.*.*

这条信息,表示sshd服务,允许向IP地址为172.16开头的IP地址提供服务
其次在/etc/hosts.deny中加入如下信息:

sshd:all:deny

这条信息,表示sshd服务不允许,向所有IP地址提供服务。
如此一来服务器将只有指定的IP地址可以访问。

使用非root用户登录

禁止root用户登录,并且设置,允许其他用户登录后,切换至root进行操作。这样黑客,如果想要通过ssh登录服务器,除了密码之外,首先他还需要知道服务器允许登录的用户,这样将大大降低黑客攻破ssh的可能性。

在服务器内创建一个用户

首先,在服务器内创建一个用户,fleapx:useradd fleapx

并且设置密码:passwd fleapx,当然密码需要尽量复杂。

允许此用户,能够以root用户身份运行命令

接下来我们需要允许此用户,能够以root用户身份运行命令。

使用visudo命令进入文本编辑模式,于92行附近

[root@localhost ~]# visudo
#然后在文件的最后面加入三行:
User_Alias USER_SU = test, test1
Cmnd_Alias SU = /bin/su

USER_SU ALL=(ALL) NOPASSWD: SU
ALL=(ALL) NOPASSWD:ALL

#或者下面三行:

User_Alias USER_SU = test, test1
#Cmnd_Alias SU = /bin/su

USER_SU ALL=(ALL) NOPASSWD: /bin/su

添加红色字体信息:"ALL=(ALL) NOPASSWD:ALL",保存退出后可以验证一下。

验证

  • 首先使用su fleapx切换至fleapx用户,接下来,我们可以使用sudo su - 命令切换到root用户。
  • 同样,我们也可以通过远程登录方式验证,使用ssh客户端,以fleapx用户登录系统后,再使用sudo su -命令进行切换。
  • 再设置,可以通过fleapx用户,登录系统,并能够自由切换至管理员用户操作后,我们需要禁止root用户,通过远程方式登录系统。

/etc/ssh/sshd_config文件内添加“PermitRootLoginno”,后重启sshd服务。启动后,root用户,就将无法通过ssh服务,直接连接到服务器。

总结   

SSH在linux中是非常常用的工具,通过SSH客户端我们可以连接到运行了SSH服务器的远程机器上,也就是说,我们可以通过ssh来远程控制我们的电脑或者服务器。那么ssh协议的优点就是数据传输是加密的,可以防止信息泄露,而且数据传输是压缩的,可以提高传输速度。 

当然,在方便同时,还存在黑客通过ssh暴力破解登录服务器的情况,例如使用密钥登录服务器等,总结以下6条防止SSH登录入侵及被破解的方法技术

1、用密钥登录,不用密码登陆
2、牤牛阵法:解决SSH安全问题
   a.防火墙封闭SSH,指定源IP限制(局域网、信任公网)
   b.开启SSH只监听本地内网IP(ListenAddress 172.16.1.61)。
3、尽量不给服务器外网IP
4、最小化(软件安装-授权)
5、给系统的重要文件或命令做一个指纹
6、保护Linux系统文件被篡改,加上给他锁命令 chattr +i  +a

附注:他锁命令详解

#锁定文件的格式(文件将无法被修改、追加和删除)
$# chattr +i aaa.txt
#解锁文件的格式(文件将可以被修改、追加和删除)
$# chattr -i aaa.txt
#锁定文件后仅可追加内容的格式(文件将无法被修改和删除,但是可以被追加新内容)
$# chattr +a aaa.txt
#解锁文件只可被追加内容的格式(文件将取消无法被修改和删除,但红四可以被追加新内容的状态)
$# chattr -a aaa.txt 
# 使用  (-R 递归地修改目录以及其下内容的属性) , 即可保护好directory目录下的所有内容.
# 设置了’i’属性的文件不能进行修改,只有超级用户可以设置或清除该属性.
$#chattr -R +i directory/

但保护整个业务系统的安全,最为重要的不是几个技术点,而是在结构设计的时候,就预先考虑到安全的因素,例如不需要向公网提供服务的服务器,就不设置公网IP地址,配置安全可靠的堡垒机。

猜你喜欢

转载自blog.csdn.net/as4589sd/article/details/112352174
今日推荐