- A+
1 SSH介绍
SSH(端口22)是Secure Shell Protocol的简写,作用是远程登录,在传输数据时可以对数据进行加密,是数据更安全。以前的远程登录是靠telnet(端口23,分加密的)的
在默认状态下。,SSH服务主要提供两个服务功能,一个是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务,另一个类似FTP服务的sftp-server,借助SSH协议来传输数据的,提供安全的SFTP服务。FTP是文件传输协议,包括(vsftp,proftp)
SSH客户端(ssh命令)还包含一个很有用的远程安全拷贝命令scp,也是通过ssh协议工作的
ssh小结:
1. SSH是安全的加密协议,用于远程连接linux服务器
2. SSH默认端口是22,安全协议版本SSH2,除了2之外还有SSH1(漏洞)
3. SSH服务端主要包括两个服务功能SSH远程连接,SFTP服务。
4. linux SSH客户端包含ssh远程连接命令,以及远程拷贝scp命令等
5. SSH版本不同是连接不上的,必须版本一样才可以
6. SSH是daemon进程
7. 在linux系统里面ssh的配置文件有两个(/etc/ssh/sshd_config和/etc/ssh/ssh_config),加d的是服务端,不带d的是客户端
SSH图解如下:
图解:
服务端产生公钥,然后客户端发请求,服务端将公钥发给客户端,客户端随机产生256字节的私钥,客户端将发过来的公钥和自己随机产生的私钥结合成秘钥对(1024字节),最后客户端将1024字节的密钥对发给服务端,双方进行链接,每一台SSH服务器主机都可以使用RSA加密方式来产生一个1024-bit的RSA Key(私钥),至二个RSA的加密方式就是用来产生公钥与私钥的算法之一,
当客户端SSH联机请求传送过来时,server就会将这个768-bit的公钥传给客户端,此时客户端会将此公钥与先前存储的公钥进行对比,看是否一样,判断标准使客户端联机用户目录下~/.ssh/known_hosts文件内容(linux客户端)
[root@m01 /]# ssh -p52113 zyl@10.0.0.31 The authenticity of host '[10.0.0.31]:52113 ([10.0.0.31]:52113)' can't be established. RSA key fingerprint is de:c5:88:e3:73:47:43:73:17:11:d8:d5:19:0e:d2:fb. Are you sure you want to continue connecting (yes/no)? yes #这是客户端第一次连接服务端没有公钥,然后yes在本地存起公钥,第二次就不会提示了,它会存到本地的~/.ssh/known_hosts文件里
2. SSH认证类型
2.1 基于口令的安全验证
基于口令的安全验证的方式就是现在我们一直在用的,只要知道服务器的SSH链接账号和口令(当然也要知道对应服务器的IP及开放的SSH端口,默认为22)就可以通过ssh客户端登录到这台远程主机,此时,联机过程中所有传输的数据都是加密的。
[root@m01 /]# ssh -p52113 zyl@10.0.0.31 zyl@10.0.0.31's password: #<== 输入密码,这是基于口令 Last login: Sun Jul 3 18:19:28 2016 from 10.0.0.61
2.2 基于密钥的安全验证
基于秘钥的安全验证是事先存在一对密钥对,然后把公用密钥(Public key)放在需要访问的目标服务器上,另外还需要把私有密钥放到SSH的客户端对应的客户端服务器上。
3. SSH服务启动
ssh服务启动
[root@nfs01 /]# /etc/init.d/sshd start Starting sshd: [ OK ]
ssh服务配置文件
[root@nfs01 /]# ll /etc/ssh/sshd_config -rw-------. 1 root root 4025 Jun 17 09:25 /etc/ssh/sshd_config
问1: 给你一个端口,如何命令行查出对应的服务是什么?
lsof –i tcp:52113 netstat –lntup|grep 52113
问2: 如果给你一个进程名rsync。如何查看对应的端口是什么?
netstat –lntup|grep rsync
4. 更改ssh默认登录配置
修改ssh服务运行参数,是通过修改配置文件/etc/ssh/sshd.config实现的
一般来说ssh服务使用默认的配置已经能够很好的工作了,如果安全要求不高,仅仅提供ssh服务的情况,可以不需要修改任何配置,
增加ssh安全方法
以下内容都是ssh配置文件/etc/ssh/sshd_config里面要做的安全提高项
[root@nfs01 /]# vim /etc/ssh/sshd_config ####zyl-sshd-2016.5.4-youhua###### Port 52113 PermitRootLogin no PermitEmptyPasswords no UseDNS no GSSAPIAuthentication no #####--end--#######
解决阿里云服务器ssh连接一段事件后就断开的问题:
在/etc/ssh/sshd.config中配置如下两行内容即可:
ClientAliveInterval 30 #客户端每隔多少秒向服务端发送一次心跳数据 ClientAliveCountMax 300 #客户端多少秒没有相应,服务端自动断开连接
参数说明:
参数 |
说明 |
Port |
指定sshd进程监听的端口号,默认为22,也可以使用多条指令监听多个端口,默认将在本机的所有网络接口上监听,但是可以通过ListenAddress指定只在某个特定的接口上监听 |
PermitRootLogin |
是否允许root登录,可用yes(默认)表示允许,no表示进制,without-password表示进制使用密码认证登录,forced-commands-only表示只有在指定command选项的情况下才允许使用公钥认证登录,同时其它认证方法全部禁止,这个值常用于做远程备份之类的事情 |
PermitEmptyPasswords |
是否允许密码为空的用户远程登录,默认为 no |
UseDNS |
指定sshd是否应该对远程主机名进行反向解析,已检查此主机名是否与其IP地址正式对应,默认值为yes,速度慢,所以设置为no |
GSSAPIAuthentication |
解决ssh连接慢 |
5. 防止SSH登录入侵
2. 牤牛阵法:解决ssh安全问题
a 防火墙封闭SSH指定源IP限制(局域网、信任公网)
b 开启SSH值监听本地内网IP(ListenAddress 10.0.0.8)
3. 尽量不给服务器外网IP
6. SSH连接
6.1 Linux客户端通过ssh连接命令
ssh基本语法使用
ssh -p52113 root@10.0.0.31 # ssh连接远程主机命令的基本语法 # -p(小写)接端口,默认端口就可以省略-p22 # @前面为用户名,如果用当前用户连接,可以不指定用户 # @后营为要连接的服务器的IP
直接登录远程主机的方法
在未禁止root远程登录及更改SSH端口前的登录方法为
[root@m01 /]# ssh -p52113 root@10.0.0.31
如果端口已经修改为特殊端口,那么用上面的命令连接就会发生问题,会报拒绝连接
[root@m01 /]# ssh -p22 root@10.0.0.31 ssh: connect to host 10.0.0.31 port 22: Connection refused #<== 连接拒接 #提示:如果出现Connection refused报错,可能是防火墙没关,还有可能是连接的对端服务ssh没开
SSH客户端命令小结
1. 切换到别的机器的用法:ssh –p52113 用户名@ip
2. 到其他机器执行命令(不会切到机器上)ssh –p 52113 user@ip 命令(全路径)
3. 当前一次SSH连接的时候,本地会产生一个密钥文件~/ssh/known_hosts(多个密钥)
6.2 ssh客户端附带的远程拷贝scp命令
scp 的基本语法使用:scp - secure copy (remote file copy program)
scp是全量拷贝,而rsync是增量拷贝(效率更高),不过scp这个命令很像rsync命令
范例:
推:PUSH scp –P52113 –r –p /tmp/test zyl@10.0.0.41:/tmp 拉:PULL scp –P52113 –r –p zyl@10.0.0.41:/tmp /tmp/test
scp为远程拷贝文件和目录的命令
[root@nfs01 /]# scp -P52113 -rp zyl@172.16.1.61:/data /tmp #解释如下: #> -P(大写,刚好和ssh命令相反)接端口,默认22端口时可以省略-P22 #--> -r递归,表示拷贝目录 #--> -p 表示在拷贝前后保持文件或目录属性 #--> -l (limit)限制速度 #--> /tmp/oldboy为本地的目录,@前为用户名,@后为要连接服务器的ip,ip后的:/tmp目录,为远端的目标目录, #--> 还可以将本地的目录推送带别的服务器也可以,只要将位置调换以下即可, 命令为:scp -P52113 -rp /tmp zyl@172.16.1.61:/data 注意:scp拷贝的权限为连接的用户对应的权限
scp知识小结
1. scp是加密的远程拷贝,而cp仅为本地拷贝
2. 可以把数据从一台机器推送到另一台机器,也可以从其它服务器吧数据拉回本地执行命令的服务器
3. 每次都是全量完整拷贝,因此,效率不高,适合第一次拷贝用,如果需要增量拷贝,用rsync.
7. SSH KEY功能生产实战应用 *****
7.1 管理服务器批量管理配置步骤
1. m01创建用户及密码(在需要使用ssh管理的服务器上面以及本机上)
useradd oldgirl #<== 在需要管理的服务器创建 echo 123456|passwd --stdin oldgirl #<==为创建的管理用户设置密码 id oldgirl #<== 检查用户是否创建成功 su – oldgirl #<== 切换到oldgirl用户执行操作
2.m01创建密钥对(以下方法任选一种即可)
ssh-keygen -t dsa #<== 一路回车创建密钥对(第一种方法)两种方法一种即可 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 #<== 非交互式创建密钥对
3. m01分发公钥
#ssh默认22端口 ssh-copy-id –i .ssh/id_dsa.pub oldgirl@172.16.1.41 #更改过的ssh端口 ssh-copy-id -i ~/.ssh/id_dsa.pub "-p52113 oldgirl@172.16.1.31"
4. 测试
ssh -p52113 oldgirl@172.16.1.41 /sbin/ifconfig eth0 ssh -p52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0 ssh -p52113 oldgirl@172.16.1.8 /sbin/ifconfig eth0 # 成功标志:连接所有被管理的服务器,不提示密码可直接操作 # 如果想批量执行可将其写进一个脚本一起执行即可
7.2 企业中实现ssh方案
1. 直接使用root ssh key 不用oldgirl
条件:允许root ssh登录,然后操作步骤换成root执行即可,还得把禁止root登录取消
优点:简单、易用
缺点:安全差、同时无法禁止root远程连接这个功能
2. sudo提权实现拷贝没有权限用户拷贝(在要管理的root用户下)
思路先把分发的文件拷贝到服务器用户家目录,然后sudo提权拷贝分发的文件到远传服务器的对应权限目录。
echo “oldgirl ALL= NOPASSWD: /usr/bin/rsync” >>/etc/sudoers visudo –c #<== 检查语法
3. 拓展:同方案2,只是不用sudo,而是设置suid对固定命令提权
说明:给一个命令授权suid权限,这样这个命令就有了个这个属主一样的权限,如passwd命令,这样不安全。
7.3 同时对多台服务器执行相同的命令
[class29@m01 scripts]cat view.sh #!/bin/bash if [# -ne 1 ] then echo "usage:0 argv1,must have 1 argvs." exit 1 fi CMD=1 for i in 31 41 61 do echo "==========172.16.1.{i}==================" ssh -p 52113 class29@172.16.1.{i} $CMD done
7.4 m01批量管理分发文件
说明:当使用下面脚本时可根据情况做调整
第一种:
[class29@m01 ~]cat scripts/fenfa.sh #!/bin/bash . /etc/init.d/functions for i in 31 41 61 do scp -P52113 ~/hosts class29@172.16.1.{i}:~ &>/dev/null &&\ ssh -t -p52113 class29@172.16.1.{i} sudo cp ~/hosts /etc/hosts &>/dev/null if [? -eq 0 ] then action "172.16.1.{i}" /bin/true else action "172.16.1.{i}" /bin/false fi done
第二种:批量分发文件(完美版)
[class29@m01 scripts]cat fenfa_file.sh #!/bin/sh . /etc/init.d/functions if [# -ne 2 ] then echo "usage:0 argv1 argv2,must have two argvs." exit fi file="1" basefile=`basename 1` remote_dir="2" for ip in (cat ~/scripts/all_iplist.txt) do scp -P52113 -r -pfile class29@ip:~ &>/dev/null &&\ ssh -p 52113 -t class29@ip sudo cp -a ~/basefileremote_dir &>/dev/null if [ ? -eq 0 ] then action "ip is successful." /bin/true else action "$ip is failure." /bin/false fi done
批量分发文件原理
1. 在m01上将想要推送的文件使用scp安全拷贝到被推送服务器的家目录
2. 将被推送的服务器cp命令授权
3. 在m01上使用ssh命令远程操作cp命令,将推送过来的文件复制到需要的·目录下下