linux ssh 远程连接

一、理论知识 目前远程连接服务器的主要类型: 文字接口明文传输:Telnet、RSH 等为主,目前非常少用。 文字接口加密:SSH 为主,已经取代上述的 Telnet、RSH 等明文传输方式。 图形接口:XDMCP(X Display Manager Control Protocol,

一、理论知识

目前远程连接服务器的主要类型:

  1. 文字接口明文传输:Telnet、RSH 等为主,目前非常少用。
  2. 文字接口加密:SSH 为主,已经取代上述的 Telnet、RSH 等明文传输方式。
  3. 图形接口:XDMCP(X Display Manager Control Protocol,架构简单,不过客户端软件较少)、VNC(Virtual Network Computing,通过 VNC Server/Client 软件来进行连接)、XRDP(Remote Desktop Protocol,类似 Windows 的远程桌面连接,需要搭建 RDP 服务器) 等较为常见。

所谓的明文传输是指:当我们的数据包在网络上传输时,该数据包的内容为数据的原始格式;也就是说使用 telnet 登录远程主机的账号、密码,数据包中的信用卡数据、密码和身份确认等重要信息,如果被类似 tcpdump 之类的监听软件截获,相应信息就被窃取了。

二、文字接口连接服务器:SSH 服务器

SSH 是 Secure Shell Protocol 的简写(安全的 shell 程序协议),它可以通过数据包加密技术将待传输的数据包加密后再传输到网路上。在默认情况下,SSH 协议本身就提供两个服务器功能:

  1. 类似 telnet 的远程连接使用 shell 的服务器,即俗称的 SSH。
  2. 类似 FTP 服务的 Sftp-Server,提供更安全的 FTP 服务。

连接加密技术简介

目前常见的网络数据包加密技术通常是通过所谓的“非对称密钥系统”来处理的:主要是通过两把不一样的公钥和私钥(Pubilc and Private Key)来进行加密和解密。

  • 公钥(Public Key):提供给远程主机进行数据加密,公钥需要提供给连接的另一方来对本地端需要接受的数据进行加密。
  • 私钥(Private Key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。因此私钥是不能够外流的,只能保护在自己的主机上。

SSH 服务器端与客户端的连接步骤

1、服务器生成公钥文件:每一次启动 SSHD 服务时,该服务都会去主动查找 /etc/ssh/ssh_host* 文件,若系统刚刚安装完成,由于没有这些密钥文件,SSHD 会主动去计算出这些需要的密钥文件。

2、客户端主动连接请求:客户端如果需要远程连接服务器端的 SSH 服务器,需要使用 SSH、Pietty 等适当的客户端程序来连接。

3、服务器发送公钥文件:在接收到客户端请求后,服务器便将第一步计算得到的公钥文件发送给客户端。此时的公钥文件通过明码进行发送,不过公钥本来就是给大家使用的,所以不用担心泄露。

4、客户端记录/比对服务器的公钥数据及随机计算自己的公私钥:若客户端第一次连接此服务器,则会将服务器的公钥数据记录到客户端的用户主目录内的 ~/.ssh/known_hosts。若是已经记录过该服务器,则客户端会对比此次接收到的公钥和之前记录的公钥是否一致。同时,客户端会开始计算客户端自己的公私钥数据(客户端每次连接时都会随机生成一个新的公私钥,因此每次连接时客户端使用的公私钥可能会不一样)

5、返回客户端公钥到服务器端:客户端将自己的公钥传送给服务器端。此时服务器端具有服务器端的私钥和客户端的公钥,而客户端具有服务器端的公钥和客户端的私钥,由于在连接中服务器和客户端的密钥系统(公钥+私钥)并不一样,所以才称为非对称式密钥系统。

6、服务器接收私钥开始双向加解密Client 在发送消息时使用 Server 端的公钥对数据包进行加密,Server 端接收到加密数据包后使用自己的私钥进行解密;Server 端发送消息是类似,使用 Client 端公钥进行加密,Client 端使用自己的私钥进行解密。

SSH 服务

当前 Linux 系统上已经默认安装了可以产生密码等协议的 OpenSSL 软件和 OpenSSH 软件了。同时当前的 Linux 发行版都是默认启动了 SSH 的。如果需要重新启动,以 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 不但提供了 Shell 给我们使用,同时还提供了一个较安全的 FTP Server,所以这个 SSHD 可以同时提供 Shell 与 FTP,而且都是架构在 Port 22 上面的。

SSH 客户端连接程序

如果客户端是 Linux,那么默认已经安装了所需要的所有指令。

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 意义不太相同。

# 1. 直接连线登入到对方主机的方法 (以登入本机为例):
[root@www ~]# ssh 127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
RSA key fingerprint is eb:12:07:84:b9:3b:3f:e4:ad:ba:f1:85:41:fc:18:3b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.0.0.1' (RSA) to the list of known hosts.
root@127.0.0.1's password: <==在这里输入 root 的密码即可!
Last login: Mon Jul 25 11:36:06 2011 from 192.168.1.101
[root@www ~]# exit  <==离开这次的 ssh 连接
# 由于 ssh 后面沒有加上账号,因此默认使用当前的账号來登入远端服务器

上面信息中 RSA 开头那行后面接的就是远程服务器的公钥指纹码,如果确认该指纹码没有问题,输入 yes 即可。此时,该服务器的公钥将被记录,因此未来再次使用 SSH 登录该主机将不再出现类似指纹码提示。

# 2. 使用 student 账号登入本机
[root@www ~]# ssh student@127.0.0.1
student@127.0.0.1's password:
[student@www ~]$ exit
# 由于加入账号,因此切换身份成为 student 了!另外,因为 127.0.0.1 曾登录过,
# 所以就不会再出现提示你要增加主机公钥的信息了!

# 3. 登录对方主机执行过指令后立刻离开的方式:
[root@www ~]# ssh student@127.0.0.1 find / &> ~/find1.log
student@localhost's password:
# 此时你会发现怎么画面卡住了?这是因为上面的指令会造成,你已经登录远端主机,
# 但是执行的指令尚未跑完,因此你会在等待当中。那如何指定系统自己跑?

# 4. 与上题相同,但是对方主机自己跑该指令,你立刻回到本地端主机继续工作:
[root@www ~]# ssh -f student@127.0.0.1 find / &> ~/find1.log
# 此时你会立刻注销 127.0.0.1 ,但 find 指令会自己在远端服务器运行!

# 5. 刪除掉 known_hosts 后,重新使用 root 连线到本机,且自动加上公钥记录
[root@www ~]# rm ~/.ssh/known_hosts
[root@www ~]# ssh -o StrictHostKeyChecking=no root@localhost
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
root@localhost's password:
# 如上所示,不会问你 yes 或 no 啦!直接会写入 ~/.ssh/known_hosts 当中!

服务器公钥记录文件:~/.ssh/known_hosts

当你登录远端服务器时,本机会主动的用接收到的服务器的 public key 去比对 ~/.ssh/known_hosts 有无相关的公钥, 然后进行下面的操作:

  • 若接收的公钥尚未记录,则询问使用者是否记录。若要记录 (范例中回答 yes 的那个步骤) 则写入 ~/.ssh/known_hosts 且继续登录的后续工作;若不记录 (回答 no) 则不写入该文件,并且退出登录工作;
     
  • 若接收到的公钥已有记录,则对比记录是否相同,若相同则继续登录操作;若不相同,则出现警告信息, 且退出登录的动作。这是用户端的自我保护功能,避免你的服务器是被別人伪装的。

[root@www ~]# ssh root@localhost
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
a7:2e:58:51:9f:1b:02:64:56:ea:cb:9c:92:5e:79:f9.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:1 <==冒号后面接的数字就是有问题资料行号
RSA host key for localhost has changed and you have requested strict checking.
Host key verification failed.

不过如果服务器系统重装造成公钥不同,可以直接在客户端 ~/.ssh/known_hosts 中找到对应记录的错误公钥,删除即可。

模拟 FTP 的文件传输方式:SFTP

如果只是想要从服务器端下载或上传文件,就需要使用 SFTP 和 SCP 了。

[root@www ~]# sftp student@localhost
Connecting to localhost...
student@localhost's password: <== 这里请输入密碼
sftp> exit  <== 这里就是在等待你输入 ftp 相关指令的地方

其中支持的指令包括:

  1. 服务器端操作:cd,ls,dir,mkdir,pwd,chgrp,chown,chmod,ln,rm,rename,exit
  2. 客户端操作(统一在前面加上小写字母 l):lcd,lls,lmkdir,lpwd
  3. 文件上传下载:put 客户端 服务器,get 服务器 客户端

[root@www ~]# sftp student@localhost
sftp> lls /etc/hosts   <==先看看本机有沒有这个文件
/etc/hosts
sftp> put /etc/hosts   <==有的话,那就上传吧!
Uploading /etc/hosts to /home/student/hosts
/etc/hosts                        100%  243     0.2KB/s   00:00
sftp> ls               <==有沒有上传成功?看远程目录下的文件名
hosts
sftp> ls -a            <==那有沒有隐藏文件呢?
.               ..              .bash_history   .bash_logout
.bash_profile   .bashrc         .mozilla        hosts
sftt> lcd /tmp         <==本机目录到 /tmp 
sftp> lpwd             <==只是進行確認而已!
Local working directory: /tmp
sftp> get .bashrc      <==沒问题就下载吧!
Fetching /home/student/.bashrc to .bashrc
/home/student/.bashrc             100%  124     0.1KB/s   00:00
sftp> lls -a           <==看本地端文件名
.        .font-unix   keyring-rNd7qX  .X11-unix
..       .gdm_socket  lost+found      scim-panel-socket:0-root
.bashrc  .ICE-unix    mapping-root    .X0-lock
sftp> exit             <==离开

文件异地直接复制:SCP

[root@www ~]# scp [-pr] [-l 速率] file  [账号@]主机:目录名 <==上传
[root@www ~]# scp [-pr] [-l 速率] [账号@]主机:file  目录名 <==下载
選項與參數:
-p :保留原本档案的权限信息;
-r :复制来源为目录时,可以复制整个目录 (含子目录)
-l :可以限制传输的速度,单位為 Kbits/s ,例如 [-l 800] 代表传输速率 100Kbytes/s

# 1. 將本机的 /etc/hosts* 全部复制到 127.0.0.1 上面的 student 用户主目录內
[root@www ~]# scp /etc/hosts* student@127.0.0.1:~
student@127.0.0.1's password: <==输入 student 密码
hosts                        100%  207         0.2KB/s   00:00
hosts.allow                  100%  161         0.2KB/s   00:00
hosts.deny                   100%  347         0.3KB/s   00:00
# 文件名显示                   进度  容量(bytes) 传输速度  剩余时间
# 你可以仔細看,出现的信息有五个字段,意义如上所示。

# 2. 将 127.0.0.1 这台远程主机的 /etc/bashrc 复制到本机的 /tmp 下面
[root@www ~]# scp student@127.0.0.1:/etc/bashrc /tmp

SSHFS 安全文件传输

SSHFS 是一种通过 SSH 协议提供文件访问、文件传输和文件管理功能的安全文件传输协议。它可以让我们通过 SSH 文件传输协议(SFTP)挂载远程的文件系统并且在本地机器上和远程的目录和文件进行交互。以下是 SSHFS 的基本用法:

1、安装SSHFS:在Linux中,您可以使用以下命令安装SSHFS:
# yum install sshfs
# dnf install sshfs 【在 Fedora 22 + 发行版上】
# sudo apt-get install sshfs 【基于 Debian/Ubuntu 的系统】

2、创建SSHFS挂载目录:您可以使用以下命令创建SSHFS挂载目录:
# mkdir /mnt/tecmint

3、挂载:使用以下命令行,在/mnt/tecmint目录下挂载远程的文件系统:
# sshfs tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint
其中,x.x.x.x是远程服务器的IP地址,tecmint是远程服务器的用户名,/home/tecmint是远程服务器上的目录。

如果端口不是默认的22,则需要指定端口:
$ sudo sshfs -o allow_other -p 22000 tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint

如果您的Linux服务器配置为基于SSH密钥授权,那么您将需要使用如下所示的命令行指定您的公共密钥的路径:
# sshfs -o IdentityFile=~/.ssh/id_rsa tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint
$ sudo sshfs -o allow_other,IdentityFile=~/.ssh/id_rsa tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint 【基于 Debian/Ubuntu 的系统】

4、卸载远程的文件系统:使用以下命令卸载远程的文件系统:
# umount /mnt/tecmint

SSHD 服务器详细配置

所有 SSHD 服务器的详细设置都放在 /etc/ssh/sshd_config 配置文件中,同时所有已被注释的设置值都是默认值。

基本上,CentOS 预设的 sshd 服务已经算是挺安全的了,不过还是建议 (1)将 root 的登录权限取消; (2)将 ssh 版本设置为 2 。其他的设置就请你依照自己的喜好来设置了。 通常不建议进行随便修改。另外,如果你修改过上面这个文件(/etc/ssh/sshd_config),那么就必需要重新启动一次 sshd 这个 daemon 才行!亦即是:/etc/init.d/sshd restart

[root@www ~]# vim /etc/ssh/sshd_config
# 1. 关于 SSH Server 的整体设置,包含使用的 port 啦,以及使用的密码演算方式
# Port 22
# SSH 预设使用 22 这个port,也可以使用多个port,即重复使用 port 这个设置项目!
# 例如想要开放 sshd 在 22 与 443 ,则多加一行內容为:『 Port 443 』
# 然后重新启动 sshd 这样就好了!不过,不建议修改 port number 啦!

Protocol 2
# 选择的 SSH 协议版本,可以是 1 也可以是 2 ,CentOS 5.x 预设是仅支持 V2。
# 如果想要支持 V1 版本,就得要使用『 Protocol 2,1 』才行。

# ListenAddress 0.0.0.0
# 监听的主机网卡!举个例子来说,如果你有两个 IP,分別是 192.168.1.100 及 
# 192.168.100.254,假设你只想要让 192.168.1.100 可以监听 sshd ,那就这样写:
# 『 ListenAddress 192.168.1.100 』预设值是监听所有接口的 SSH 要求

# PidFile /var/run/sshd.pid
# 可以放置 SSHD 这个 PID 的文件!上述为默认值

# LoginGraceTime 2m
# 当使用者连上 SSH server 之后,会出现输入密码的界面,在该界面中,
# 在多久時間內沒有成功连上 SSH server 就強迫断开连接!若无单位则默认时间为秒!

# Compression delayed
# 指定何时开始使用压缩数据模式进行传输。有 yes, no 与登录后才将文件压缩 (delayed)

# 2. 说明主机的 Private Key 放置的文件,默认使用下面的文件即可!
# HostKey /etc/ssh/ssh_host_key        # SSH version 1 使用的私钥
# HostKey /etc/ssh/ssh_host_rsa_key    # SSH version 2 使用的 RSA 私钥
# HostKey /etc/ssh/ssh_host_dsa_key    # SSH version 2 使用的 DSA 私钥
# 还记得我们在主机的 SSH 连线流程里面谈到的,这里就是 Host Key ~

# 3. 关于登录文件的信息数据放置与 daemon 的名称!
SyslogFacility AUTHPRIV
# 当有人使用 SSH 登录系统的时候,SSH 会记录信息,这个信息要记录在什么 daemon name
# 下面?默认是以 AUTH 来设置的,即是 /var/log/secure 里面!如果忘记了
# 可回到 Linux 基础去翻一下。其他可用的 daemon name 为:DAEMON,USER,AUTH,
# LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,

# LogLevel INFO
# 登录的等级

# 4. 安全设置项目!极重要!
# 4.1 登录设置部分
# PermitRootLogin yes
# 是否允许 root 登入!默认是允许的,但是建议设置为 no

# StrictModes yes
# 是否让 sshd 去检查用户主目录或相关文件的权限数据,
# 这是为了担心永华将某些重要文件的权限设错,可能会导致一些问题所致。
# 例如用户的 ~.ssh/ 权限设错时,某些特殊情況下会不许用户登录

# PubkeyAuthentication yes
# AuthorizedKeysFile      .ssh/authorized_keys
# 是否允许用戶自行使用成对的密码系统进行登录行为,仅针对 version 2。
# 至于自定义的公钥数据就放置于用户主目录下的 .ssh/authorized_keys 內

PasswordAuthentication yes
# 密码验证当然是需要的!所以这里写 yes 

# PermitEmptyPasswords no
# 若上面那一项如果设置为 yes 的话,這一项就最好设置为 no ,
# 这个选项用于设置是否允许以空的密码登录!当然不许!

# 4.2 认证部分
# RhostsAuthentication no
# 本机系统不使用 .rhosts,因为仅使用 .rhosts太不安全了,所以这里一定要设置为 no

# IgnoreRhosts yes
# 是否取消使用 ~/.ssh/.rhosts 来作为认证!当然是!

# RhostsRSAAuthentication no #
# 这个选项是专门 version 1 用的,使用 rhosts 文件在 /etc/hosts.equiv
# 配合 RSA 演算方式来进行认证!不要使用啊!

# HostbasedAuthentication no
# 这个选项与上面的选项类似,不过是给 version 2 使用的!

# IgnoreUserKnownHosts no
# 是否忽略主目录內的 ~/.ssh/known_hosts 这个文件所记录的主机内容?
# 当然不要忽略,所以这里就是 no 啦!

ChallengeResponseAuthentication no
# 允许任何的密码认证!所以,任何 login.conf 规定的认证方式,均可使用!
# 但目前我們比较喜欢使用 PAM 模块帮忙管理认证,因此这个选项可以设置为 no 

UsePAM yes
# 利用 PAM 管理用户认证有很多好处,可以记录与管理。
# 所以这里我們建议你使用 UsePAM 且 ChallengeResponseAuthentication 设置为 no 
 
# 4.3 与 Kerberos 有关的参数设置!因为我们沒有 Kerberos 主机,所以底下不用设置!
# KerberosAuthentication no
# KerberosOrLocalPasswd yes
# KerberosTicketCleanup yes
# KerberosTgtPassing no
 
# 4.4 底下是有关在 X-Window 下使用的相关设置!
X11Forwarding yes
# X11DisplayOffset 10
# X11UseLocalhost yes
# 比较重要的是 X11Forwarding 选项,它可以让窗口的数据通过 ssh 通道来传输
# 在本章后面比較进阶的 ssh 使用方法中会谈到。

# 4.5 登录后的选项:
# PrintMotd yes
# 登录后是否显示出一些信息呢?例如上次登录的时间、地点等等,默认是 yes
# 亦即是列印出 /etc/motd 这个文件的內容。但是,如果为了安全,可以考虑改为 no !

# PrintLastLog yes
# 显示上次登录的信息!可以啊!默认也是 yes !

# TCPKeepAlive yes
# 当实现连接后,服务器会一直传送 TCP 数据包給客户端,用以判断对方是否一直存在连接。
# 不过,如果连接时中间的路由器暂时停止服务几秒钟,也会让连接中断
# 在这种情況下,任何一端死掉后,SSH可以立刻知道!而不会有僵尸程序的发生!
# 但如果你的网络或路由器常常不稳定,那么可以设置为 no

UsePrivilegeSeparation yes
# 是否使用权限较低的程序來提供用户操作。我们知道 sshd 启动在 port 22 ,
# 因此启动的程序是属于 root 的身份。那么当 student 登录后,这个设置值
# 会让 sshd 产生一个属于 sutdent 的 sshd 程序来使用,对系统较安全

MaxStartups 10
# 同时允许几个尚未登录的连接界面?当我们连上 SSH ,但是尚未输入密码时,
# 这个时候就是我们所谓的连接界面啦!在这个连接界面中,为了保护主机,
# 所以需要设置最大值,默认最多十个连接界面,而已经建立连接的不计算在这十个当中

# 4.6 关于用户限制的设置选项:
DenyUsers *
# 设置被限制的用户名称,如果是全部的用户,那就是全部阻挡吧!
# 若是部分用户,可以将该账号填入!例如下列!
DenyUsers test

DenyGroups test
# 与 DenyUsers 相同!仅阻挡几个组

# 5. 关于 SFTP 服务与其他的设置选项!
Subsystem       sftp    /usr/lib/ssh/sftp-server
# UseDNS yes
# 一般来说,为了要判断客户端来源是正常合法的,因此会使用 DNS 去反查客户端端的主机名
# 不过如果是在内网互连,这个选项可以设置为 no 会让连接速度比較快。

制作不用密码可立即登录的SSH用户

主要通过将客户端的公钥提前放置到 ~/.ssh/authorized_keys 中即可,同时注意 /etc/ssh/sshd_config 中的相关选项设置正确。

# PubkeyAuthentication yes
# AuthorizedKeysFile      .ssh/authorized_keys
# 是否允许用戶自行使用成对的密码系统进行登录行为,仅针对 version 2。
# 至于自定义的公钥数据就放置于用户主目录下的 .ssh/authorized_keys 內

1、客户端建立两把密钥:想一想,在密码系統中,是公钥比较重要还是私钥比较重要? 当然是私钥比较重要!因此私钥才是解密的关键啊!所以,这两把密钥当然得在发起连接的客户端配置才对。利用的指令為 ssh-keygen 这个命令;

[vbirdtsai@clientlinux ~]$ ssh-keygen [-t rsa|dsa] <==可选 rsa 或 dsa
[vbirdtsai@clientlinux ~]$ ssh-keygen  <==用默认的方法生成密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vbirdtsai/.ssh/id_rsa): <==按 enter
Created directory '/home/vbirdtsai/.ssh'. <==此目录若不存在则会主动生成
Enter passphrase (empty for no passphrase): <==按 Enter 不给密码
Enter same passphrase again: <==再输入一次 Enter 吧!
Your identification has been saved in /home/vbirdtsai/.ssh/id_rsa. <==私钥文件
Your public key has been saved in /home/vbirdtsai/.ssh/id_rsa.pub. <==公钥文件
The key fingerprint is:
0f:d3:e7:1a:1c:bd:5c:03:f1:19:f1:22:df:9b:cc:08 vbirdtsai@clientlinux.centos.vbird

[vbirdtsai@clientlinux ~]$ ls -ld ~/.ssh; ls -l ~/.ssh
drwx------. 2 vbirdtsai vbirdtsai 4096 2011-07-25 12:58 /home/vbirdtsai/.ssh
-rw-------. 1 vbirdtsai vbirdtsai 1675 2011-07-25 12:58 id_rsa      <==私钥文件
-rw-r--r--. 1 vbirdtsai vbirdtsai  416 2011-07-25 12:58 id_rsa.pub  <==公钥文件

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

[vbirdtsai@clientlinux ~]$ scp ~/.ssh/id_rsa.pub dmtsai@192.168.100.254:~
# 上传到 dmtsai 的主目录下即可。

3、将公钥放置服务器端的正确目录和文件中去:最后,将那把 Public Key 放在任何一个你想要用来登录的服务器端的某 User 的主目錄內之 .ssh/ 里面的认证文件中即可完成整个程序。

# 1. 生成 ~/.ssh 目录,注意权限需要为 700
[dmtsai@www ~]$ ls -ld .ssh
ls: .ssh: 沒有此一文件或目录
# 由于可能是新建的用戶,因此这个目录不存在。不存在才进行下面建立目录的操作

[dmtsai@www ~]$ mkdir .ssh; chmod 700 .ssh
[dmtsai@www ~]$ ls -ld .ssh
drwx------. 2 dmtsai dmtsai 4096 Jul 25 13:06 .ssh
# 权限设置中,务必是 700 且属于用户本人的账号和群组才行!

# 2. 将公钥文件內的信息使用 cat 转存到 authorized_keys 內
[dmtsai@www ~]$ ls -l *pub
-rw-r--r--. 1 dmtsai dmtsai 416 Jul 25 13:05 id_rsa.pub <==确实有存在

[dmtsai@www ~]$ cat id_rsa.pub >> .ssh/authorized_keys
[dmtsai@www ~]$ chmod 644 .ssh/authorized_keys
[dmtsai@www ~]$ ls -l .ssh
-rw-r--r--. 1 dmtsai dmtsai 416 Jul 25 13:07 authorized_keys
# 这个文件的权限设置中,就得要是 644 才可以!不可以搞混了!

建议安全设置

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

# 1. 先观察一下所需要的账号是否存在呢?
[root@www ~]# for user in sshnot1 sshnot2 sshnot3 testssh student; do \
> id $user | cut -d ' ' -f1-3 ; done
uid=507(sshnot1) gid=509(sshnot1) groups=509(sshnot1),508(nossh)
uid=508(sshnot2) gid=510(sshnot2) groups=510(sshnot2),508(nossh)
uid=509(sshnot3) gid=511(sshnot3) groups=511(sshnot3),508(nossh)
uid=511(testssh) gid=513(testssh) groups=513(testssh)
uid=505(student) gid=506(student) groups=506(student)
# 若上述账号并不存在你的系统,请自己创建出來!UID/GID 与鸟哥的不同也沒关系!

# 2. 修改 sshd_config 并且重新启动 sshd 吧!
[root@www ~]# vim /etc/ssh/sshd_config
PermitRootLogin no  <==约在第 39 行,请取消注释且修改成这样
DenyGroups  nossh   <==下面这两行可以加在文件的最后面
DenyUsers   testssh

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

# 3. 测试与观察相关账号的登录情況吧!
[root@www ~]# ssh root@localhost  <==并请输入正确的密码
[root@www ~]# tail /var/log/secure
Jul 25 13:14:05 www sshd[2039]: pam_unix(sshd:auth): authentication failure; 
logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost  user=root
# 你会发现出现这个错误信息,而不是密码输入错误而已。

[root@www ~]# ssh sshnot1@localhost  <==并请输入正确的密码
[root@www ~]# tail /var/log/secure
Jul 25 13:15:53 www sshd[2061]: User sshnot1 from localhost not allowed because
a group is listed in DenyGroups

[root@www ~]# ssh testssh@localhost  <==并请输入正确的密码
[root@www ~]# tail /var/log/secure
Jul 25 13:17:16 www sshd[2074]: User testssh from localhost not allowed 
because listed in DenyUsers

2、/etc/hosts.allow 及 /etc/hosts.deny

设置允许与拒绝访问的ip

[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 

3、iptables 数据包过滤防火墙

可以在 iptables.rule 内将 Port 22 的放行功能取消,然后再到 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 服务器的高级应用

在非标准端口启动 SSH(非 Port 22)

1、设置 SSH 在 Port 22 及 23 两个端口监听

[root@www ~]# vim /etc/ssh/sshd_config
Port 22
Port 23    <==注意喔!要有兩个 Port 的设置才行!

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

2、非标准端口的连接方式

[root@www ~]# ssh -p 23 root@localhost
root@localhost's password:
Last login: Tue Jul 26 14:07:41 2011 from 192.168.1.101
[root@www ~]# netstat -tnp | grep 23
tcp  0  0 ::1:23               ::1:56645              ESTABLISHED 7327/2
tcp  0  0 ::1:56645            ::1:23                 ESTABLISHED 7326/ssh
# 因为网络是双向的,因此自己连自己 (localhost),就會抓到兩条连接!

以 rsync 进行同步镜像备份

  1. 在本机上直接运行,用法就与 cp 几乎一模一样,例如:rsync -av /etc /tmp (将 /etc/ 的数据备份到 /tmp/etc 內)
  2. 通过 rsh 或 ssh 的通道在 server / client 之間进行数据传输,例如:rsync -av -e ssh user@rsh.server:/etc /tmp (将 rsh.server 的 /etc 备份到本地主机的 /tmp 內)
  3. 直接通过 rsync 提供的服务 (daemon) 来传输,此时 rsync 主机需要启动 873 port:
    a. 你必须要在 server 端启动 rsync , 看 /etc/xinetd.d/rsync 即可;
    b. 你必须编辑 /etc/rsyncd.conf 配置文件;
    c. 你必须设置好 client 端连接的密码数据;
    d. 在 client 端可以利用:rsync -av user@hostname::/dir/path /local/path

[root@www ~]# rsync [-avrlptgoD] [-e ssh] [user@host:/dir] [/local/path]
选项与参数:
-v :观察模式,可以列出更多的信息,包括鏡像的文件名等;
-q :与 -v  相反,安静模式,略过正常信息,仅显示错误信息;
-r :递归复制!可以针对『目录』来处理!很重要!
-u :仅更新 (update),若目标文件较新,则保留新文件不会覆盖;
-l :复制链接文件的属性,而非链接的目标原始文件内容;
-p :复制时,连通属性 (permission) 也保存不变!
-g :保存源文件的群组;
-o :保存源文件的属住;
-D :保存源文件的设备属性 (device)
-t :保存源文件的时间参数;
-I :忽略更新时间 (mtime) 的属性,文件对比上会比较快速;
-z :在信息传输时,加上压缩的参数!
-e :使用的通道协议,例如使用 ssh 通道,则 -e ssh
-a :相当于 -rlptgoD ,所以这个 -a 是最常用的参数了!
更多说明请参考 man rsync 的解说!

# 1. 将 /etc 的数据备份到 /tmp 下:
[root@www ~]# rsync -av /etc /tmp
....(前面省略)....
sent 21979554 bytes  received 25934 bytes  4000997.82 bytes/sec
total size is 21877999  speedup is 0.99
[root@www ~]# ll -d /tmp/etc /etc
drwxr-xr-x. 106 root root 12288 Jul 26 16:10 /etc
drwxr-xr-x. 106 root root 12288 Jul 26 16:10 /tmp/etc <==瞧!两个目录一样!
# 第一次运行时会花比较久的时间,因为首次建立嘛!如果再次备份呢?

[root@www ~]# rsync -av /etc /tmp
sent 55716 bytes  received 240 bytes  111912.00 bytes/sec
total size is 21877999  speedup is 390.99
# 比较一下两次 rsync 的传输与接收数据量,你就会发现立刻就跑完了!
# 传输的数据也很少!因为在此比对,仅有差异的数据会被复制。

# 2. 利用 student 的身份登录 clientlinux.centos.vbird 将主目录复制到本机 /tmp
[root@www ~]# rsync -av -e ssh student@192.168.100.10:~ /tmp 
student@192.168.100.10's password:  <==输入对方主机的 student 密码
receiving file list ... done
student/
student/.bash_logout
....(中间省略)....
sent 110 bytes  received 697 bytes  124.15 bytes/sec
total size is 333  speedup is 0.41

[root@www ~]# ll -d /tmp/student
drwx------. 4 student student 4096 Jul 26 16:52 /tmp/student
# 瞧!这样就做好备份啦!很简单吧!

通过 SSH 通过加密原本无加密的服务

假设服务器器上面有启动了 VNC 服务在 port 5901 ,客户端则使用 vncviewer 要连接到服务器上的 port 5901 就是了。 那现在我们在客户端电脑上面启动给一个 5911 的端口,然后再通过本地端的 ssh 连接到服务器的 sshd 去,而服务器的 sshd 再去连接服务器的 VNC port 5901 。整个连接的图示如下所示:

[root@clientlinux ~]# ssh -L 本地端口:127.0.0.1:远程端口 [-N] 远程主机
选项与参数:
-N :仅启动连接通道,不登录远程 sshd 服务器
本地端口:就是开启 127.0.0.1 上面一个监听端口
远程端口:指定连接到后面远程主机的 sshd 后,sshd 该连到那个端口进行传输

# 1. 在客户端启动所需要的端口进行的指令
[root@clientlinux ~]# ssh -L 5911:127.0.0.1:5901 -N 192.168.100.254
root@192.168.100.254's password:
   <==登录远程仅是开启一个监听端口

# 2. 在客户端在另一个终端机测试看看,这个命令不需要进行,只是查阅而已
[root@clientlinux ~]# netstat -tnlp| grep ssh
tcp  0   0 0.0.0.0:22           0.0.0.0:*            LISTEN      1330/sshd
tcp  0   0 127.0.0.1:5911       0.0.0.0:*            LISTEN      3347/ssh
tcp  0   0 :::22                :::*                 LISTEN      1330/sshd
[root@clientlinux ~]# netstat -tnap| grep ssh
tcp  0   0 192.168.100.10:55490 192.168.100.254:22   ESTABLISHED 3347/ssh
# 在客户端启动 5911 的端口是 ssh 启动的,同一个 PID 也连接到远程喔!

以 SSH 通道配合 X Server 传递图形界面

知秋君
上一篇 2024-07-09 19:12
下一篇 2024-07-09 18:48

相关推荐