赞
踩
SSH是安全的加密协议,用于远程连接Linux服务器,默认端口是22,安全协议版本是SSH2 。
SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。
ssh服务端由2部分组成: openssh(提供ssh服务)、openssl(提供加密的程序),主要功能是提供SSH连接和作为SFTP服务器。
ssh的客户端:包含ssh连接命令和远程拷贝scp命令等,可以用 XSHELL,Securecrt, Mobaxterm等工具进行连接。
服务器启动的时候,自己产生一个密钥(768bit公钥),本地的ssh客户端,发送连接请求到ssh服务器,服务器检查连接点客户端发送的数据和IP地址,确认合法后,发送密钥(768bits)给客户端,此时客户端将本地私钥(256bit),和服务器的公钥(768bit),结合成密钥对key(1024bit),发回给服务器端,建立连接,通过key-pair数据传输。
加密技术:传输过程,数据加密。
ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利。
- 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
azdebug_it@azdebug_it:~$ ssh-copy-id -i .ssh/id_rsa.pub fleapx@192.168.16.16
注意: ssh-copy-id 将key写到远程机器的 ~/ .ssh/authorized_key.文件中
- azdebug_it@azdebug_it:~$ ssh fleapx@192.168.16.16
- 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 fleapx@192.168.16.16
- #第一次需要密码登录
上述是给fleapx用户,赋予无密码登陆的权利。
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的内容)
- 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
- #ssh -N -L 9906:localhost:3306 root@10.1.0.2
- ssh -L 9906:10.1.0.2:3306 root@10.1.0.2
- ssh -f -N -L 9906:10.1.0.2:3306 root@10.1.0.2
- ssh -f -N -L 10.1.0.1:9906:10.1.0.2:3306 root@10.1.0.2
现在你可以直接在浏览器中输入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 –
在比较本地文件和远程文件是否有差异时这个命令很管用。
sshfs name@server:/path/to/folder /path/to/mount/point
从http://fuse.sourceforge.net/sshfs.html下载sshfs,它允许你跨网络安全挂载一个目录。
ssh -t reachable_host ssh unreachable_host
Unreachable_host表示从本地网络无法直接访问的主机,但可以从reachable_host所在网络访问,这个命令通过到reachable_host的“隐藏”连接,创建起到unreachable_host的连接。
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 -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-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 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登录自动填充密码功能。
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命令,迁移数据库到新服务器最快最好的方法。
sed -i 8d ~/.ssh/known_hosts
cat ~/.ssh/id_rsa.pub | ssh user@machine “mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys”
如果你使用Mac OS X,或其它没有ssh-copy-id命令的*nix变种,这个命令可以将你的公钥复制到远程主机,因此你照样可以实现无密码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
(可能需要启用额外的软件仓库)。
ssh -t user@some.domain.com /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命令的快速参考。
- 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 root@server.com ‘tshark -f “port !22″ -w -' | wireshark -k -i –
- #使用tshark捕捉远程主机上的网络通信,通过SSH连接发送原始pcap数据,并在wireshark中显示,
- #按下Ctrl+C将停止捕捉,但也会关闭wireshark窗口,
- #可以传递一个“-c #”参数给tshark,让它只捕捉“#”指定的数据包类型,
- #或通过命名管道重定向数据,而不是直接通过SSH传输给wireshark,
- #建议你过滤数据包,以节约带宽,tshark可以使用tcpdump替代:
- ssh root@example.com tcpdump -w – ‘port !22′ | wireshark -k -i –
autossh -M50000 -t server.example.com ‘screen -raAd mysession’
打开一个SSH会话后,让其保持永久打开,对于使用笔记本电脑的用户,如果需要在Wi-Fi热点之间切换,可以保证切换后不会丢失连接。
ssh -4 -C -c blowfish-cbc
强制使用IPv4,压缩数据流,使用Blowfish加密。
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-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。
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 -vvv root@172.16.8.50
或者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地址,登录即可保护您的服务器。
操作起来相当简单,首先在/etc/hosts.allow中加入如下信息:
sshd:172.16.*.*
这条信息,表示sshd服务,允许向IP地址为172.16开头的IP地址提供服务。
其次在/etc/hosts.deny中加入如下信息:
sshd:all:deny
这条信息,表示sshd服务不允许,向所有IP地址提供服务。
如此一来服务器将只有指定的IP地址可以访问。
禁止root用户登录,并且设置,允许其他用户登录后,切换至root进行操作。这样黑客,如果想要通过ssh登录服务器,除了密码之外,首先他还需要知道服务器允许登录的用户,这样将大大降低黑客攻破ssh的可能性。
首先,在服务器内创建一个用户,fleapx:useradd fleapx
并且设置密码:passwd fleapx,当然密码需要尽量复杂。
接下来我们需要允许此用户,能够以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",保存退出后可以验证一下。
在/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地址,配置安全可靠的堡垒机。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。