Linux运维学习笔记之十:SSH服务

第十八章 SSH服务

一、SSH服务基础

1、简介

SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台-包括HP-UX、LinuxAIXSolarisDigital UNIXIrix,以及其他平台,都可运行SSH。

2、SSH服务提供的功能
(1)提供类似telnet的远程联机服务器的服务,即SSH服务。
(2)提供类似FTP服务的sftp-server,借助SSH协议来传输数据,提供更安全的SFTP服务。
(3)提供远程安全拷贝命令SCP。
3、SSH服务结构
(1)服务端:OpenSSH和OpenSSL
(2)客户端:

Linux:SSH

Windows:SecureCRT、Putty、xshell

(3)守护进程:sshd
(4)配置文件:/etc/ssh/sshd_config

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

 

(5)协议版本:

a、1.x和2.x

b、2.x的客户端不能连接到1.x的服务程序上。

4、ssh服务认证类型
(1)基于口令的安全验证

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==

(2)基于密钥的安全验证
5、小结
(1)ssh是安全的加密协议,用于远程连接服务器
(2)默认端口是22,安全协议版本是ssh2
(3)服务端主要包含2个服务功能:ssh远程连接和SFTP服务
(4)客户端主要包含2个服务功能:ssh连接命令和scp远程拷贝命令

 

二、SCP命令基础

1、作用:远程拷贝命令
2、格式:
(1)格式一:推的方式push,将文件发送到远程服务器

scp -P端口号 本地要拷贝的文件 选程机的用户名@IP:目录  #默认端口22可以不写

scp test.txt [email protected]:/tmp

(2)格式二:拉的方式pull,将文件从远程服务器拷贝回来

scp -P端口号 远程机的用户名@IP:目录或文件  本地机的目录

scp [email protected]:/tmp/test.txt /wddg

3、参数

-P:指定端口号

-r:表示要拷贝目录

-p:表示在拷贝前后保持文件或目录属性

4、小结:

scp是加密的远程拷贝,可以把数据从一台服务器推送到另一台服务器,也可以从其它服务器把数据拉回到本地服务器,但每次都是全量拷贝(rsync是增量拷贝),因此效率不高

三、SFTP服务基础

1、格式

sftp -oPort=22 [email protected]

2、操作命令

操作远程主机与普通Linux操作命令一样:cd、pwd等

操作本地主机要在所有命令前加上l:lcd、lpwd等

上传文件到远程主机命令:put 

put /etc/hosts /tmp

下载远程主机文件到本地命令:get

get /etc/hosts /tmp

3、演示

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

4、小结:

(1)sftp -oPort=22 [email protected]

(2)上传put 加客户端本地路径

(3)下载get 服务端内容,下载到本地的当前目录

(4)put和get也可以指定上传下载目录,

(5)put和get只能针对文件进行操作,不能是目录

(6)查看配置参数

egrep -v "^#|^$"/etc/ssh/sshd_config

四、SSH应用之一:批量分发

1、演示环境

主机名

IP

用途

操作系统

linuxDelivery

192.168.58.238

中心分发服务器

CentOS6.8

StudyLinux

192.168.58.85

接收节点服务器

CentOS6.8

LS-B16175

192.168.16.75

接收节点服务器

RedHat6.4

2、需求分析

要求所有服务器在同一用户下,实现从中心分发服务器将本地数据分发到接收节点服务器,在分发过程中不需要各接收节点服务器提示密码验证,除了分发功能,还需要可以批量查看客户机上的CPU、LOAD、MEM以及系统版本等使用信息。

3、增加分发用户:在所有机器上设置同一用户oldboy

在SecureCRT的交互界面中操作:

(1)删除所有服务器上的oldboy用户,如查有组没有删除需手动删除

userdel -rf oldboy

(2)新增用户

useradd oldboy

(3)检查用户

id oldboy

(4)在每台服务器上查看执行情况
(5)统一设置oldboy密码

echo 123456 | passwd --stdin oldboy

4、创建密钥对,实现免密登陆
(1)将所有服务器切换到oldboy用户下

su - oldboy

(2)检查是否切换成功

whoami

(3)密钥类型

dsa:数字签名算法.即Digital Signature Algorithm

rsa:一种加密算法,即可用于加密,也可用于数据签名来实现认证

ssh-keygen -t dsa:建立dsa类型密钥.-t参数是指建立密钥的类型

ssh-keygen -t rsa:建立rsa类型密钥

(4)在中心分发服务器上创建密钥(实际上可在任何一台机器上创建都行)

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.       |

+-----------------+

(5)检查生成的密钥,以.pub结尾的是公钥

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

(6)分发公钥

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

5、批量分发
(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

(2)测试

sh fenfa.sh a.txt

(3)查看是否成功

ll /wddg/share

-rw-rw-r-- 1 oldboy oldboy 8 Feb 17 13:29 a.txt

(4)完善分发脚本

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

(5)测试

sh fenfa2.sh a.txt /home/oldboy/

如果失败,则可 –x调试

sh –x fenfa2.sh a.txt /home/oldboy/

五、SSH应用之二:批量管理

1、编写管理脚本

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

2、测试(参数中如果有空格必须加双引号)

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

六、SSH应用之三:批量分发加强

1、ssh服务通过sudo 提权拷贝文件实现分发(同步用户对部分目录无操作权限)
(1)思路

先将要拷贝的文件分发到指定的接收节点服务器,再通过配置了sudo提权的cp命令,将相文件拷贝指定目录。

(2)设置/etc/sudoers(通过SecureCRT在root用户下更新所有节点服务器的/etc/sudoers文件)

visudo

oldboy ALL=(ALL)   NOPASSWD:/bin/cp

(3)检查语法

visudo –c

(4)测试

visudo cp hosts /etc/

(5)远程执行sudo命令

由于安全方面的限制,ssh服务一般不让远程执行sudo命令。如查非要远程执行sudo,有以下功2种方法:

a、使用-t参数(建议使用)

ssh –t hostname sudo <cmd>

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

(6)优化分发脚本

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条命令当成一行来执行。

2、ssh服务通过加了特殊权限的rsync命令拷贝文件实现分发(同步用户对部分目录无操作权限)
(1)对rsync命令加上s权限

which rsync

chmod 4755 /usr/bin/rsync

(2)检查

ll /usr/bin/rsync

(3)修改分发脚本

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

七、小结

1、免密码登陆认证是单向,如果希望可以互相免密认证,需要两边都进行免密操作
2、免密登陆认证是基于用户的,最好不要跨不同用户
3、SSH连接慢时,需要设置/etc/ssh/sshd_config文件中的UseDNS 和GSSAPIAuthentication为no

  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]进行调试

4、批量分发1000台初始都需要输入一次密码,并且第一次连接要确认(可发通过expect自动应答)
5、对于需要将文件分发到没有操作权限的目录和文件时,有3种方法

a、利用root做ssh key验证

优点:简单、易用

缺点:安全差,同时无法禁止root远程连接,一旦分发服务器的root被破,则全部服务器被破

应用:有80%的企业

b、利用sudo提权

优点:安全

缺点:配置复杂

c、利用特殊权限位,原理同sudo提权(拓展思路)

优点:相对安全

缺点:复杂,安全性一般,任何人都可以处理带有suid权限的命令

d、建议

追求简单,选1,考虑安全,选2,不建立选3

6、统一分发的重要安全思想

不管用什么方法,一定要管理好中心分发服务器。因为它的权限很大,很重要。

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上,由服务器定时下载.

发布了40 篇原创文章 · 获赞 15 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章