SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台-包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
Linux:SSH
Windows:SecureCRT、Putty、xshell
a、查看系统支持的协议
grep Protocol /etc/ssh/sshd_config
CentOS5.x: Protocol 2, 1
CentOS6.x: Protocol 2
b、查看临时公钥ServerKeyBits长度
grep ServerKeyBits /etc/ssh/sshd_config
#ServerKeyBits 1024 (CentOS5.x为 768)
c、说明:sshd_config是配置服务端,ssh_config是配置客户端
vi /etc/ssh/sshd_config
:set nu #vi的功能,显示行号
Port 28888 #13行
PermitRootLogin no #42行,禁止root用户ssh远程登录
PermitEmptyPasswords no #65行,禁止空密码登录
GSSAPIAuthentication no #为防止GSSAPI导致SSH连接变慢
UseDNS no #122行,禁止使用DNS
a、1.x和2.x
b、2.x的客户端不能连接到1.x的服务程序上。
a、连接格式:
(i)ssh -p端口号 用户名@IP #默认22可不写
ssh -p28888 [email protected] #需输入192.168.58.238的密码
(ii)ssh -p端口号 用户名@IPcommand #此方式执行命令后,会退回当前机器
ssh [email protected] /sbin/ifconfig #由于环境变量不识别,所以需全路径
b、查看家目录下的.ssh中是否存在know_hosts文件
ll ~/.ssh/know*
-rw-r--r-- 1 root root 394 Feb 14 19:47 known_hosts
c、查看know_hosts文件内容
cat known_hosts
192.168.58.238 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvzhqkn7q/+dqo+LVbFCKsnUYG9WQudjue
Yl8NY3neiDaxxnuf84faY73NEuF0WtOR0c5N14aPQQhMbIPinFbRuqFbZBQspxbR+nd/j/df43U2P+xCIk3rxC7+7SpHdau/5a/yUtsAYKMUmp+5Jx4EWPasy1Ww+OvwmMBOXFFE5Mf1oNg/Z+lQZlM7n9bQn2iEXu5BVjaY8Z1mo7xRM5ClF/nZ3pa8S+HpQRQ/gXRhvYLp/DRSvbiz2Hc/zkXRcwd+uhOZXsmVagOIgIJ3qcsbQHIZfFBU9jaiDIHqGc4LmPxRlr/RhaH3vdULjpbjAVE1EMPDX4/i1GncLuLtT/h8Q==
scp -P端口号 本地要拷贝的文件 选程机的用户名@IP:目录 #默认端口22可以不写
scp test.txt [email protected]:/tmp
scp -P端口号 远程机的用户名@IP:目录或文件 本地机的目录
scp [email protected]:/tmp/test.txt /wddg
-P:指定端口号
-r:表示要拷贝目录
-p:表示在拷贝前后保持文件或目录属性
scp是加密的远程拷贝,可以把数据从一台服务器推送到另一台服务器,也可以从其它服务器把数据拉回到本地服务器,但每次都是全量拷贝(rsync是增量拷贝),因此效率不高
sftp -oPort=22 [email protected]
操作远程主机与普通Linux操作命令一样:cd、pwd等
操作本地主机要在所有命令前加上l:lcd、lpwd等
上传文件到远程主机命令:put
put /etc/hosts /tmp
下载远程主机文件到本地命令:get
get /etc/hosts /tmp
sftp -oPort=22 [email protected]
Connecting to 192.168.58.238...
[email protected]'s password:
sftp> pwd
Remote working directory: /root
sftp> cd /wddg
sftp> pwd
Remote working directory: /wddg
sftp> ls -l
-rw-r--r-- 1 root root 15 Feb 14 22:49 server.txt
sftp> lpwd
Local working directory: /tmp
sftp> lls -l
-rw-r--r-- 1 root root 17 Feb 14 22:53 client.txt
drwx------ 2 gdm gdm 4096 Feb 14 18:53 orbit-gdm
sftp> put client.txt
Uploading client.txt to/wddg/client.txt client.txt 100% 17 0.0KB/s 00:00
sftp> get server.txt
Fetching /wddg/server.txt to server.txt/wddg/server.txt 100% 15 0.0KB/s00:00
sftp> ls -l
-rw-r--r-- 1 root root 17 Feb 14 22:51client.txt
-rw-r--r-- 1 root root 15 Feb 14 22:49server.txt
sftp> lls -l
-rw-r--r-- 1 root root 17 Feb 14 22:53 client.txt
drwx------ 2 gdm gdm 4096 Feb 14 18:53 orbit-gdm
-rw-r--r-- 1 root root 15 Feb 14 22:55 server.txt
(1)sftp -oPort=22 [email protected]
(2)上传put 加客户端本地路径
(3)下载get 服务端内容,下载到本地的当前目录
(4)put和get也可以指定上传下载目录,
(5)put和get只能针对文件进行操作,不能是目录
(6)查看配置参数
egrep -v "^#|^$"/etc/ssh/sshd_config
主机名 |
IP |
用途 |
操作系统 |
linuxDelivery |
192.168.58.238 |
中心分发服务器 |
CentOS6.8 |
StudyLinux |
192.168.58.85 |
接收节点服务器 |
CentOS6.8 |
LS-B16175 |
192.168.16.75 |
接收节点服务器 |
RedHat6.4 |
要求所有服务器在同一用户下,实现从中心分发服务器将本地数据分发到接收节点服务器,在分发过程中不需要各接收节点服务器提示密码验证,除了分发功能,还需要可以批量查看客户机上的CPU、LOAD、MEM以及系统版本等使用信息。
在SecureCRT的交互界面中操作:
userdel -rf oldboy
useradd oldboy
id oldboy
echo 123456 | passwd --stdin oldboy
su - oldboy
whoami
dsa:数字签名算法.即Digital Signature Algorithm
rsa:一种加密算法,即可用于加密,也可用于数据签名来实现认证
ssh-keygen -t dsa:建立dsa类型密钥.-t参数是指建立密钥的类型
ssh-keygen -t rsa:建立rsa类型密钥
ssh-keygen -t dsa
Generatingpublic/private dsa key pair.
Enter file inwhich to save the key (/home/oldboy/.ssh/id_dsa): #直接回车,默认就行
Createddirectory '/home/oldboy/.ssh'.
Enter passphrase(empty for no passphrase): #直接回车,不用输入密码
Enter samepassphrase again:
Youridentification has been saved in /home/oldboy/.ssh/id_dsa.
Your public keyhas been saved in /home/oldboy/.ssh/id_dsa.pub.
The keyfingerprint is:
91:8e:8e:1f:f2:ea:d8:34:73:8f:7b:65:1c:e3:69:b8oldboy@linuxDelivery
The key'srandomart image is:
+--[ DSA1024]----+
| |
| . |
| o |
| o .o |
| . S+ + |
| o .B |
| * + = |
| + B +E |
| ..+.=o. |
+-----------------+
ll ~/.ssh
-rw------- 1 oldboy oldboy 668 Feb 1614:35 id_dsa #私钥,权限小600
-rw-r--r-- 1 oldboy oldboy 610 Feb 16 14:35id_dsa.pub #公钥,权限较大644
ll -d .ssh
drwx------ 2 oldboy oldboy 4096 Feb16 14:35 .ssh #.ssh目录的权限是700
a、格式
ssh-copy-id -i 公钥文件 接收服务器用户@服务器 #该脚本命令只能发公钥
ssh-copy-id -i 公钥文件 "-p端口号接收服务器用户@服务器" #非默认端口特殊写法,要用双引号
b、操作
ssh-copy-id -i .ssh/id_dsa.pub [email protected]
The authenticity of host '192.168.58.85 (192.168.58.85)' can't beestablished.
RSA key fingerprint isde:91:c6:84:6e:40:8c:ec:89:7b:da:58:11:eb:43:4f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.58.85' (RSA) to the list ofknown hosts.
[email protected]'s password: #由于是第一次连接该服务器,需输入密码123456
Now try logging into the machine, with "ssh '[email protected]'",and check in:
.ssh/authorized_keys #成功的标志
to make sure we haven't added extra keys that you weren't expecting.
[oldboy@linuxDelivery ~]$ ssh-copy-id -i .ssh/id_dsa.pub [email protected]
The authenticity of host '192.168.16.75 (192.168.16.75)' can't beestablished.
RSA key fingerprint is 04:ed:29:64:cd:f9:c7:3a:4a:50:a8:82:c5:05:77:8c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.16.75' (RSA) to the list ofknown hosts.
[email protected]'s password: #由于是第一次连接该服务器,需输入密码123456
Now try logging into the machine, with "ssh '[email protected]'",and check in:
.ssh/authorized_keys #成功
to make sure we haven't added extra keys that you weren't expecting.
c、查看接收节点服务器接收的文件(已自动改名由id_dsa.pub改为authorized_keys,权限改为是600)
ll .ssh
-rw------- 1 oldboy oldboy610 Feb 16 14:41 authorized_keys #权限是600
d、测试
ssh [email protected] #成功,免密
ssh [email protected] #成功,免密
e、ssh-copy-id脚本原理
就是把~/.ssh/id_dsa.pub文件复制到指定的接收节点服务器对应用户的家目录下的.ssh目录(提前创建,权限为700)下,并将文件名改为authorized_keys,设置权限为600
grep authorized_keys /etc/ssh/sshd_config
#AuthorizedKeysFile .ssh/authorized_keys
which ssh-copy-id
/usr/bin/ssh-copy-id
cat /usr/bin/ssh-copy-id #核心语名在第41行:
{ eval "$GET_ID" ; } | ssh $1 "exec sh -c 'umask 077;test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys &&(test -x /sbin/restorecon && /sbin/restorecon ~/.ssh~/.ssh/authorized_keys >/dev/null 2>&1 || true)'" || exit 1
vi fenfa.sh
if [ $# -ne 1 ] # $#表示参数的个数,-ne表示不等于
then
echo "/bin/sh $0arg1"
exit 1
fi
for n in '192.168.16.75' '192.168.58.85'
do
scp $1 oldboy@$n:/wddg/share
done
sh fenfa.sh a.txt
ll /wddg/share
-rw-rw-r-- 1 oldboy oldboy 8 Feb 17 13:29 a.txt
vi fenfa2.sh
#!/bin/sh
file="$1"
remotedir="$2"
. /etc/init.d/functions #系统内置函数库
if [ $# -ne 2 ]
then
echo "USAGE:/bin/sh $0 arg1 arg2"
exit 1
fi
for n in '192.168.16.75' '192.168.58.85'
do
scp $fileoldboy@$n:$remotedir >/dev/null 2>&1
if [ $? –eq 0 ] # $?表示上一函数是否正确执行,0表示正常用执行
then
action "scp$file to $remotedir is ok" /bin/true #action表示调用系统函数库
else
action "scp$file to $remotedir is fail" /bin/false
fi
done
sh fenfa2.sh a.txt /home/oldboy/
如果失败,则可 –x调试
sh –x fenfa2.sh a.txt /home/oldboy/
vi view.sh
#!/bin/sh
if [ $# -ne 1 ]
then
echo"/bin/sh $0 arg1"
exit 1
fi
for n in '192.168.1.5'
do
ssh root@$n $1
done
sh view.sh "/sbin/ifconfig eth0 | sed -rn 's#^.*addr:(.*) Bcas.*#\1#gp'"
192.168.1.5
sh view.sh /usr/bin/free
total used free shared buffers cached
Mem: 2071068 71308 1999760 0 14824 27088
先将要拷贝的文件分发到指定的接收节点服务器,再通过配置了sudo提权的cp命令,将相文件拷贝指定目录。
visudo
oldboy ALL=(ALL) NOPASSWD:/bin/cp
visudo –c
visudo cp hosts /etc/
由于安全方面的限制,ssh服务一般不让远程执行sudo命令。如查非要远程执行sudo,有以下功2种方法:
a、使用-t参数(建议使用)
ssh –t hostname sudo
b、修改sshd_config配置文件(有安全隐患)
将文件中的Defaults requiretty这行注释,但会造成安全隐患,建议用第一种,加-t参数
c、不加-t执行,会报错
ssh [email protected] sudo/bin/cp ~/hosts /etc/hosts
d、报错
sudo: sorry, you must have a tty to run sudo
f、加-t执行,成功
ssh –t [email protected]sudo /bin/cp ~/hosts /etc/hosts
vi fenfa3.sh
#!/bin/sh
file="$1"
remotedir="$2"
. /etc/init.d/functions #系统内置函数库
if [ $# -ne 2 ]
then
echo "USAGE:/bin/sh $0 arg1 arg2"
exit 1
fi
for n in '192.168.16.75' '192.168.58.85'
do
scp $fileoldboy@$n:~ >/dev/null 2>&1 &&\
ssh –t [email protected] sudo /bin/cp ~/$file $remotedir&>/dev/null
if [ $? –eq 0 ] # $?表示上一函数是否正确执行,0表示正常用执行
then
action "scp$file to $remotedir is ok" /bin/true #action表示调用系统函数库
else
action "scp$file to $remotedir is fail" /bin/false
fi
done
说明:
&&\中的&&表示前面的命令执行成功后才会执行下一条命令。\表示换行.也就是把这2条命令当成一行来执行。
which rsync
chmod 4755 /usr/bin/rsync
ll /usr/bin/rsync
vi fenfa3.sh
#!/bin/sh
file="$1"
remotedir="$2"
. /etc/init.d/functions #系统内置函数库
if [ $# -ne 2 ]
then
echo "USAGE:/bin/sh $0 arg1 arg2"
exit 1
fi
for n in '192.168.16.75' '192.168.58.85'
do
scp $fileoldboy@$n:~ >/dev/null 2>&1 &&\
ssh –t [email protected] /usr/bin/rsync ~/$file$remotedir &>/dev/null
if [ $? –eq 0 ] # $?表示上一函数是否正确执行,0表示正常用执行
then
action "scp$file to $remotedir is ok" /bin/true #action表示调用系统函数库
else
action "scp$file to $remotedir is fail" /bin/false
fi
done
vi /etc/ssh/sshd_config
:set nu #vi的功能,显示行号
Port 28888 #13行
PermitRootLogin no #42行,禁止root用户ssh远程登录
PermitEmptyPasswords no #65行,禁止空密码登录
GSSAPIAuthenticationno #为防止GSSAPI导致SSH连接变慢
UseDNSno #122行,禁止使用DNS
也可以通过ssh -v [email protected]进行调试
a、利用root做ssh key验证
优点:简单、易用
缺点:安全差,同时无法禁止root远程连接,一旦分发服务器的root被破,则全部服务器被破
应用:有80%的企业
b、利用sudo提权
优点:安全
缺点:配置复杂
c、利用特殊权限位,原理同sudo提权(拓展思路)
优点:相对安全
缺点:复杂,安全性一般,任何人都可以处理带有suid权限的命令
d、建议
追求简单,选1,考虑安全,选2,不建立选3
不管用什么方法,一定要管理好中心分发服务器。因为它的权限很大,很重要。
a、一定要取消中心分发服务器的外网IP
b、中心分发服务器开启防火墙,禁止ssh对外用户登陆。
c、仅授权某一台后端无外网的服务器(跳板机A)访问中心分发服务器。并且该服务器也没有外网IP,只能通过VPN登陆。
d、中心分发服务器的跳板机A只能由跳板机B需要通过VPN连接.
e、管理时,管理员连接到跳板机B,再通过VPN连接到跳板机A, 再由跳板机访问中心分发服务器,进行相应分发操作.
1、最简单最常用的是ssh key,功能也最强大。一般中小型企事业会用,规模在50-100台发下。
2、sina cfengine较早的批量管理工具,现在基本没有企业用了。
3、门户级别比较流行的,puppet批量管理工具,复杂、笨重。
4、saltstack批量管理工具,简单、功能强大(配置复杂)
5、http + cron :将要分发的文件放在http上,由服务器定时下载.