首页 > 代码库 > ssh (笔记)

ssh (笔记)


注:以下是Unix-like的相关操作  Windows 并没有 ssh 的客户端程序,因此所有的程序windows都得要下载其他第三方软件才行

主要有 pietty, psftp 及 filezilla 等

putty/pscp/psftp 他们分别对应了 ssh/scp/sftp  Windows的相关软件操作 不做介绍


SSH 协议,在预设的状态中,本身就提供两个服务器功能:

    1. 一个就是类似 telnet 的远程联机使用 shell 的服务器,亦即是俗称的 ssh ;

    2. 另一个就是类似 FTP 服务的 sftp-server !提供更安全的 FTP 服务。


非对称密钥系统

    透过两把不一样的公钥与私钥来进行加密与解密的过程

    公钥 (public key):提供给远程主机进行数据加密的行为,也就是说,大家都能取得你的公钥来将数据加密的意思;

    私钥 (private key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。私钥是不能够外流的!只能保护在自己的主机上。

    目前在 SSH 使用上,主要是利用 RSA/DSA/Diffie-Hellman 等机制喔!


ssh联机过程

    1. 服务器建立公钥文件: 

        每一次启动 sshd 服务时,该服务会主动去找 /etc/ssh/ssh_host* 的文件, sshd 会主动去计算出这些需要的公钥文件,和主机自己需要的私钥文件

        重装系统也会执行以上操作

    2. 客户端主动联机要求: 

        若客户端想要联机到 ssh 服务器,则需要使用适当的客户端程序来联机,包括 ssh, pietty 等客户端程序;

    3. 服务器传送公钥给客户端

        接收到客户端的联机要求后,服务器便将第一个步骤取得的公钥传送给客户端使用 (此时应是明码传送,反正公钥本来就是给大家使用的!);

    4. 客户端记录/比对服务器的公钥数据及随机计算自己的公私钥: 

        client第一次联机会把server的公钥文件记录到用户家目录内的 ~/.ssh/known_hosts 。

        若已经记录过了,则客户端会去比对此次接收到的与之前的记录是否有差异。若接受此公钥数据, 则开始计算客户端自己的公私钥数据;

        密钥是随机运算产生于每次联机当中

    5. 回传客户端的公钥数据到服务器端: 

        用户将自己的公钥传送给服务器。

        此时服务器:『具有服务器的私钥与客户端的公钥』,

        客户端则是: 『具有服务器的公钥以及客户端自己的私钥』

        在此次联机的服务器与客户端的密钥系统 (公钥+私钥) 并不一样,所以才称为非对称式密钥系统

    6. 开始双向加解密

        (1)服务器到客户端:服务器传送数据时,拿用户的公钥加密后送出。客户端接收后,用自己的私钥解密;

        (2)客户端到服务器:客户端传送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密。


启动ssh服务

Unix-like 系统当中,默认就已经含有 SSH 的所有需要的软件了!其中包含了

可以产生密码等协议的LinuxOpenSSL软件和OpenSSH软件

服务端直接启动就是以 SSH daemon ,简称为 sshd 来启动

    [root@www ~]# /etc/init.d/sshd restart

    [root@www ~]# netstat -tlnp | grep ssh

    Active Internet connections (only servers)

    Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name

    tcp        0      0 :::22          :::*             LISTEN  1539/sshd


客户端连接服务器 使用ssh指令

    [root@www ~]# ssh [-f] [-o 参数项目] [-p 非正规埠口] [账号@]IP [指令]

    选项与参数:

    -f :需要配合后面的 [指令] ,不登入远程主机直接发送一个指令过去而已;

    -o 参数项目:主要的参数项目有:

    ConnectTimeout=秒数 :联机等待的秒数,减少等待的时间

    StrictHostKeyChecking=[yes|no|ask]:预设是 ask,若要让 public key

          主动加入 known_hosts ,则可以设定为 no 即可。

    -p :如果你的 sshd 服务启动在非正规的埠口 (22),需使用此项目;

    [指令] :不登入远程主机,直接发送指令过去。但与 -f 意义不太相同。


ssh 192.168.129.158                                                                                                                                                                                         1

The authenticity of host ‘192.168.129.158 (192.168.129.158)‘ can‘t be established.

RSA key fingerprint is b5:49:85:1e:6d:0d:81:2d:2d:ef:30:12:cd:36:0d:fe. 这一行后边的就是远程服务器的公钥指纹码

Are you sure you want to continue connecting (yes/no)? yes 输入 yes 将指纹码写入本地公钥记录文件 (~/.ssh/known_hosts)

Warning: Permanently added ‘192.168.129.158‘ (RSA) to the list of known hosts. 加入之后未来比对该服务器的正确性之用


    登陆服务器执行指令之后立刻离开 常用在需要关闭远程服务器时使用

    [Jade@localhost-3:~]  ssh -f  root@192.168.129.158 find / &> ~/find1.log

    root@192.168.129.158‘s password:


    联机时自动在本地添加公钥 写程序脚本需要连接多台主机时比较有用

    [Jade@localhost-3:~]ssh -o StrictHostKeyChecking=no root@192.168.129.158                                                                                                                                                

    Warning: Permanently added ‘192.168.129.158‘ (RSA) to the list of known hosts.

    root@192.168.129.158‘s password:


如果服务器的ssh公钥变化(比如删除了服务器/etc/ssh/ssh_host_*文件 或重装系统后)那么客户端ssh联机时就会报错

因为本地存储的公钥(~/.ssh/know_host中对应ip后的数据)和服务器的公钥不同造成 此时只要删除本地know_host对应ip的行 重新连接写入即可

[Jade@localhost-3:~/shell] ssh root@192.168.129.158                                                                                                                                                                            

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Someone could be eavesdropping on you right now (man-in-the-middle attack)!

It is also possible that a host key has just been changed.

The fingerprint for the RSA key sent by the remote host is

46:69:89:d8:b7:e1:28:49:ac:4f:92:fd:8e:2d:a2:05.

Please contact your system administrator.

Add correct host key in /Users/Jade/.ssh/known_hosts to get rid of this message.

Offending RSA key in /Users/Jade/.ssh/known_hosts:42

RSA host key for 192.168.129.158 has changed and you have requested strict checking.

Host key verification failed.


sftp:使用ssh的通道(part22)模拟FTP的文件上传与下载

[Jade@localhost-3:~] sftp root@192.168.129.158

root@192.168.129.158‘s password:

Connected to 192.168.129.158.

sftp> 这里即可输入ftp相关的指令

针对远方服务器主机 (Server) 之行为
变换目录到 /etc/test 或其他目录cd /etc/test
cd PATH
列出目前所在目录下的文件名ls
dir
建立目录mkdir directory
删除目录rmdir directory
显示目前所在的目录pwd
更改档案或目录群组chgrp groupname PATH
更改档案或目录拥有者chown username PATH
更改档案或目录的权限chmod 644 PATH
其中,644 与权限有关!回去看基础篇!
建立连结档ln oldname newname
删除档案或目录rm PATH
更改档案或目录名称rename oldname newname
离开远程主机exit (or) bye (or) quit
针对本机 (Client) 之行为(都加上 l, L 的小写 )
变换目录到本机的 PATH 当中lcd PATH
列出目前本机所在目录下的文件名lls
在本机建立目录lmkdir
显示目前所在的本机目录lpwd
针对资料上传/下载的行为
将档案由本机上传到远程主机put [本机目录或档案] [远程]
put [本机目录或档案]
如果是这种格式,则档案会放置到目前远程主机的目录下!
将档案由远程主机下载回来get [远程主机目录或档案] [本机]
get [远程主机目录或档案]
若是这种格式,则档案会放置在目前本机所在的目录当中!可以使用通配符,例如:
get *
get *.rpm
亦是可以的格式!


注意上传文件夹的话需要OpenSSH 5.4即以上


scp:异地直接复制

[root@www ~]# scp [-pr] [-l 速率] file  [账号@]主机:目录名 <==上传

[root@www ~]# scp [-pr] [-l 速率] [账号@]主机:file  目录名 <==下载

选项与参数:

-p :保留原本档案的权限数据;

-r :复制来源为目录时,可以复制整个目录 (含子目录)

-l :可以限制传输的速度,单位为 Kbits/s ,例如 [-l 800] 代表传输速限 100Kbytes/s


将本地的shell目录 保留原本文件权限数据 复制到远程主机~/目录下

[Jade@localhost-3:~] scp -pr shell root@192.168.129.158:~/

root@192.168.129.158‘s password:

将远程文件复制到本地

[Jade@localhost-3:~] scp root@192.168.129.158:~/top.txt ./

root@192.168.129.158‘s password:

top.txt



sshd服务器详细设定

[root@bird ~]# vim /etc/ssh/sshd_config

只要是预设有出现且被批注的(#)设定值为默认值

通常只是设置不允许root的ssh登录 ssh的版本设为V2 其余默认已经很好

技术分享

技术分享

技术分享

技术分享

制作不用密码立即登入的ssh用户

    1. 客户端建立两把钥匙:利用的指令为 ssh-keygen 这个命令;

    2. 客户端放置好私钥文件:将 Private Key 放在 Client 上面的家目录,亦即 $HOME/.ssh/ , 并且得要注意权限喔!

    3. 将公钥放置服务器端的正确目录与文件名去:

        最后,将那把 Public Key 放在任何一个你想要用来登入的服务器端的某 User 的家目录内之 .ssh/ 里面的认证文件即可完成整个程序。

为jade用户(新创建的)设置ssh的无需密码登录服务器

    client操作

jade用户创建密钥文件

bash-3.2$ ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/Users/jade/.ssh/id_rsa):

Created directory ‘/Users/jade/.ssh‘.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /Users/jade/.ssh/id_rsa.

Your public key has been saved in /Users/jade/.ssh/id_rsa.pub.

The key fingerprint is:

94:6b:ad:7b:b5:77:0d:b1:fc:f3:34:77:18:23:53:cb jade@localhost-3.local


注意目录和两个密钥文件的权限设定

bash-3.2$ ls -ld .ssh/; ls -l .ssh/

drwx------  4 jade  staff  136 11 23 14:32 .ssh/

total 16

-rw-------  1 jade  staff  1675 11 23 14:32 id_rsa

-rw-r--r--  1 jade  staff   404 11 23 14:32 id_rsa.pub


将公钥上传到服务器的用户家目录

bash-3.2$ scp ~/.ssh/id_rsa.pub jade@192.168.129.158:~


    server操作

/home/wanjiadi/下如果没有.ssh目录 手动创建 注意权限

[jade@bird ~]# mkdir .ssh;chmod 700 .ssh

将client端上传的公钥使用cat 新增到authorized_keys中

[jade@bird ~]# cat id_rsa.pub >> .ssh/authorized_keys

[jade@bird ~]# chmod 644 .ssh/authorized_keys

[jade@bird ~]# ls -l .ssh

-rw-r--r--. 1 jade jade 404 11月 23 18:34 authorized_keys


当你还想要登入其他的主机时,只要将你的 public key copy 到其他主机上面去,并且新增到某账号的 ~/.ssh/authorized_keys 这个文件中即可


建议安全设定

其实sshd的数据是加密的 所以在Internet上面传递时比较安全 至于sshd服务本身并不是那么安全 安全设定建议 以下三条

服务器软件本身的设定强化:/etc/ssh/sshd_config

# 修改 sshd_config 并且重新启动 sshd !

[root@www ~]# vim /etc/ssh/sshd_config

PermitRootLogin no  <==约在第 39 行,请拿掉批注且修改成这样

DenyGroups  nossh   <==底下这两行可以加在档案的最后面

DenyUsers   testssh


TCP wrapper 的使用:/etc/hosts.allow, /etc/hosts.deny

[root@www ~]# vim /etc/hosts.allow

sshd: 127.0.0.1 192.168.1.0/255.255.255.0 192.168.100.0/255.255.255.0


[root@www ~]# vim /etc/hosts.deny

sshd : ALL


iptables 的使用: iptables.rule, iptables.allow

[root@www ~]# vim /usr/local/virus/iptables/iptables.allow

iptables -A INPUT -i $EXTIF -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -i $EXTIF -s 192.168.100.0/24 -p tcp --dport 22 -j ACCEPT

[root@www ~]# /usr/local/virus/iptables/iptables.rule


ssh进阶应用


非22端口启动ssh服务

    很多 cracker 会使用扫描程序乱扫整个 Internet 的端口漏洞,这个 port 22 就是一个很常被扫描的端口

[root@www ~]# vim /etc/ssh/sshd_config
Port 4444
Port 4445  <==注意喔!要有两个 Port 的设定才行!
[root@www ~]# /etc/init.d/sshd restart

centos6.7直接就可以使用了 老版本可能会出现SELinux的错误 必须自行定一个SELinux的规则放行模块才行

# 1. 于 /var/log/audit/audit.log 找出与 ssh 有关的 AVC 信息,并转为本地模块

[root@www ~]# cat /var/log/audit/audit.log | grep AVC | grep ssh |
\>  audit2allow -m sshlocal > sshlocal.te
 <==扩展名要是 .te 才行

[root@www ~]# grep sshd_t /var/log/audit/audit.log |
\>  audit2allow -M sshlocal
 <==sshlocal 就是刚刚建立的 .te 文件名

******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i sshlocal.pp   <==这个指令会编译出这个重要的 .pp 模块!

# 2. 将这个模块加载系统的 SELinux 管理当中!
[root@www ~]# semodule -i sshlocal.pp

#3. 再重新启动 sshd 并且观察埠口吧!
[root@www ~]# /etc/init.d/sshd restart
[root@www ~]# netstat -tlunp | grep ssh
tcp        0      0 0.0.0.0:4444   0.0.0.0:*    LISTEN      7322/sshd
tcp        0      0 0.0.0.0:4445   0.0.0.0:*    LISTEN      7322/sshd
tcp        0      0 :::4444       :::*         LISTEN      7322/sshd
tcp        0      0 :::4445       :::*         LISTEN      7322/sshd


联机方式指定端口

[Jade@localhost-3:~] ssh root@192.168.129.158 -p4444

查看端口使用情况

[root@bird ~]# netstat -tnp | grep 4444
tcp        0      0 192.168.129.158:
4444     192.168.129.174:49988       ESTABLISHED 15879/sshd

rsync进行同步镜像备份

    见rsync篇笔记





















ssh (笔记)