linux 下ssh 服务配置
 
SSH 服务器:

   既然 telnet 不是很安全,那么我又需要以远程联机服务来操控我的 Linux 主机,那么应该怎么办呀!?最好的方法当然就是以较为安全的联机机制的方案来解决联机的问题啰!那么该如何解决这样的问题呢?这也不难啦,使用 SSH 即可。那么 SSH 是什么呢?他有什么特异功能?简单的来说,SSH 是 Secure SHell protocol 的简写,他可以经由将联机的封包加密的技术,来进行资料的传递,因此,资料当然就比较安全啰!这个 SSH 可以用来取代 Internet 上面较不安全的 finger, R Shell (rcp, rlogin, rsh 等指令), talk 及 telnet 等联机模式。底下我们将先简介一下 SSH 的联机模式,来说明为什么 SSH 会比较安全呢!

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

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

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

· 联机加密技术简介:

基本上,加密的技术通常是藉由所谓的『公钥与私钥』亦即『Public and Private keys』来进行加密与解密的动作!如下图所示,当 SSH 激活服务之后,会产生一支公钥,而身为个人计算机的你,在进行与 server 的联机时,可以藉由自己产生的私钥来提供 server 的联机之用,也可以直接藉由 server 提供的私钥来进行联机!这个与进行联机时选择的加密版本有关,这个等一下我们再提!

linux 下ssh 服务配置_休闲

在上面的图标中,我们可以知道,当数据由 Server 端传送到 Client 端时,这些资料会先经过『公钥, Public Key』来进行加密的行为,所以,在传输的过程中,这些资料本身是经过加密的,因此,即使这些资料在途中被截取时,要破解这些加密的资料,还是得要花费上 好长一段时间的。那么等这些经过公钥加密的资料传送到 Client 端之后,就可以藉由所谓的『私钥, Private Key』来进行解密的动作。需要注意的是,这些公钥与私钥在每一部计算机上面都不一样,所以,你与 Server 的联机对其他人来说,都是很难去破解的呢!那么这些公钥与私钥是如何产生的呢?底下我们来谈一谈目前 SSH 的两种版本的联机模式啰!

o SSH protocol version 1:


每一部主机都可以使用 RSA 加密方式来产生一个 1024-bit 的 RSA Key ,这个 RSA 的加密方式,主要就是用来产生公钥与私钥的演算方法!这个 version 1 的整个联机的加密步骤可以简单的这么看:

1. 当每次 SSH daemon (sshd) 激活时,就会产生一支 768-bit 的公钥(或称为 server key)存放在 Server 中;

2. 若有 client 端的需求传送来时,那么 Server 就会将这一支公钥传给 client ,而 Client 藉由比对本身的 RSA 加密方式来确认这一支公钥;

3. 在 Client 接受这个 768-bit 的 server key 之后,Client 自己也会随机产生一支 256-bit 的私钥(host key),并且以加密的方式将 server key 与 host key 整合成一支完整的 Key ,并且将这支 Key 也传送给 server ;

4. 之后,Server 与 Client 在这次的联机当中,就以这一支 1024-bit 的 Key 来进行资料的传递!
当然啦,因为 Client 端每次的 256-bit 的 Key 是随机取的,所以你这次的联机与下次的联机的 Key 就会不一样啦!

o SSH protocol version 2:

与 version 1 不同的是,在 version 2 当中将不再产生 server key 了,所以,当 Client 端联机到 Server 端时,两者将藉由 Diffie-Hellman key 的演算方式来产生一个分享的 Key ,之后两者将藉由类似 Blowfish 的演算方式进行同步解密的动作!

每一个 sshd 都提供这两个版本的联机,而决定这两种模式联机的,就必需要在 client 端联机时选择联机的模式才能确认。目前预设情况下,会自动使用 version 2 的联机模式喔!而由于我们的联机资料中,经过了这个 Public 与 Private Key 的加密、解密动作,所以在中间的传送过程中,当然就比较安全的多啰!


------------------------------------------------------------------------------------------------

激活 ssh 服务:

事实上,在我们使用的 Linux 系统当中,预设就已经含有 SSH 的所有需要的套件了!这包含了可以产生密码等协议的 OpenSSL 套件与 OpenSSH 套件,所以呢,要激活 SSH 真的是太简单了!就直接给他激活就是了!此外,在目前的 Linux Distributions 当中,都是预设激活 SSH 的,所以一点都不麻烦,因为不用去设定,他就已经激活了!哇!真是爽快~无论如何,我们还是得说一说这个激活的方式吧!直接激活就是以 SSH daemon ,简称为 sshd 来激活的,所以,手动可以这样激活:

linux 下ssh 服务配置_linux_02

上面两种方式都可以直接手动激活 sshd 这个服务!然后使用 netstat -tl 看看能不能看到 ssh 的服务在监听呢!?如果出现了上面那一行×××字体,就表示您的 SSH 已经正确的激活啰!这真是太简单了吧!没错,但是他就是这么简单~

那么我要如何在开机的时候就激活这个 sshd 呢?如果是 Red Hat 的系统,可以使用 ntsysv 这支程序,而 Mandrake 可以使用 chkconfig 这个程序!至于 OpenLinux 则可以到 /etc/sysconfig/daemons 去看看喔!

这个方式仅适合在已经有 OpenSSH 的 Linux Distributions 当中,如果以 Red Hat 6.x 为例,他并没有预设使用 SSH 怎么办?别担心,可以参考一下底下这个鸟哥之前写过的网页,有详细的说明使用 tarball 安装的步骤呢!

使用 Tarbal 安装 SSH 以及升级 SSH 可能会遇到的问题说明

需要注意的是, SSH 不但提供了 shell 给我们使用,亦即是 ssh protocol 的主要目的,同时亦提供了一个较为安全的 FTP server ,亦即是 ssh-ftp server 给我们当成是 FTP 来使用!所以,这个 sshd 可以同时提供 shell 与 ftp 喔!而且都是架构在 port 22 上面的呢!所以,底下我们就来提一提,那么怎么样由 Client 端连接上 Server 端呢?同时,如何以 FTP 的服务来连接上 Server 并且使用 FTP 的功能呢?
------------------------------------------------------------------------------------------------

· ssh 客户端联机: ssh, putty

由于 Linux 与 Windows 这两个客户端的 Client 联机软件并不一样,所以我们分为两个部分来说明:

o Linux 客户端:

在 Linux 客户端方面,我们主要以 ssh 进行一般联机,而已 sftp 进行 FTP 的使用联机!分别简介如下:

linux 下ssh 服务配置_服务配置_03

这里请特别留意的是,如果直接以 ssh hostname 来连接进入 hostname 这个主机时,则进入 hostname 这个主机的『帐号名称』将会是目前你所在的这个环境当中的使用者帐号!以上面为例,因为我是以 root 的身份在执行,所以如果我执行了『 ssh host.domain.name 』时,那么对方 host.domain.name 这部主机,就会以 root 的身份来让我进行密码确认的登入动作!因此,为了避免这样的麻烦,通常我都是以简单的 e-mail 的写法来登入远方的主机,例如『ssh user@hostname 』即表示,我是以 user 这个帐号去登入 hostname 这部主机的意思。当然,也可以使用 -l username 这样的形式来书写!登入对方主机之后,其它的所有执行行为都跟在 Linux 主机内没有两样~所以,真的是很简单吧! ^_^ 这样就可以达到远程控管主机的目的了!此外,在预设的情况下, SSH 是『允许你以 root 的身份登入』喔!呵呵!更是爽快啦!此外,请特别留意的是,当您要连接到对方的主机时,如果是首次连接,那么 Server 会问你,你的联机的 Key 尚未被建立,要不要接受 Server 传来的 Key ,并建立起联机呢?呵呵!这个时候请『务必要输入 yes 而不是 y 或 Y』,这样程序才会接受喔!

那么如何使用 SSH FTP 的功能呢?也是很容易啦!就是使用 sftp 这支程序即可!而登入的方式与 ssh 相同,都是使用 sftp -l username hostname 或者直接以 sftp user@hosname 来书写!执行之后会有底下的模样:

linux 下ssh 服务配置_ssh_04

进入到 sftp 之后,那就跟在一般 FTP 模式下的操作方法没有两样了!底下我们就来谈一谈, sftp 这个接口下的使用指令吧!

linux 下ssh 服务配置_ssh_05
linux 下ssh 服务配置_休闲_06

就整体而言, sftp 在 Linux 底下,如果不考虑图形接口,那么他已经可以取代 FTP 了呢!因为所有的功能都已经涵盖啦!因此,在不考虑到图形接口的 FTP 软件时,可以直接关掉 FTP 的服务,而改以 sftp-server 来提供 FTP 的服务吧! ^_^

o Windows 客户端:

在 Linux 底下已经有 ssh 了,那么如果在 Windows 底下呢?该怎么办?呵呵!这个可以直接使用 putty 这种类型的联机软件呢,他也是免费的软件喔!取得的方式可以参考底下的网站:
[url]http://www.chiark.greenend.org.uk/~sgtatham/putty/[/url]

好了,那么要取得哪几个程序呢?其实只要 putty.exe 及 psftp.exe 这两支程序就够了!分别用来登录 shell 及 FTP 的呢!

o putty:

直接在 Windows 底下执行,执行的图标有点像底下这样:

linux 下ssh 服务配置_ssh_07

这个时候请注意,由于我们比较喜欢将固定的几个主机的IP记录下来,所以在这里我们需要先进行一些基本的设定才行!在上图中,我们需要填写:

(1)HostName(or IP address) 那一项,及

(2)Saved Sessions 取个好记的名字,

(3)并且选择 SSH 那个选项才行!

以我的区域内网络为例,我可以写成这个模样:

linux 下ssh 服务配置_休闲_08

请千万记得,填写完毕之后,一定要按下右边的『Save』按键,这样你的设定才会被记录下来喔!接着下来,我们要设定的是每次登入的时候,都会进行记录 的项目,所以,你可以在左边的画面上面按下『Logging』然后将右边的『Always append to the end of it』,这样才不会每次登入的时候,系统都要问你一次,是否需要记录!

linux 下ssh 服务配置_ssh_09

接着下来,我们还可以调整整个 putty 的屏幕大小呢!以下图为例,我设定我的登入画面为 40 行与 100 个字符!这样的画面比起传统的 24 * 80 要大的多,看起来也比较舒服就是了~那么那个 1000 表示我的滚动条有 1000 行的纪录,可以方便我往前查询呢!

linux 下ssh 服务配置_ssh_10

调整完了屏幕的大小之后,再来这是最重要的:『你要以第几个 SSH version 进入?!』前面说过,我们预设是以 version2 来登入的,所以这里我们可以调整为 2 那个项目!这样每次登入都会以 version 2 的模式登入主机了!

linux 下ssh 服务配置_系统_11

好了,已经都设定完毕了,再来当然又是要记录啰!所以请回到『Session』的设定里面,再按下一次『Save』,这个时候在中间的大框框就会出现你 输入的记录名称,然后,以后要登入 SSH 主机时,就直接给他点两下 test.linux.org 那个(就是你刚刚自行设定的纪录名称),就可以进入你所点选的主机啰!

linux 下ssh 服务配置_服务配置_12

整个 putty 大致上的流程就是这样!如此一来,您就可以在 Windows 上面以 SSH 的协议,登入远程的 Linux 主机噜!粉方便吧! ^_^ !如果还要其它的设定,那么就直接修改 Saved Sessions 与 HostName 这两个项目,然后再次给他 Save ,嘿嘿!就又多一个设定值了!而且还是跟刚刚的设定值相同!很容易设定的啦!

o psftp:


这一支程序的重点则是在于以 sftp 联机上 Server 。联机的方式可以直接点选 psftp 这个档案,让他直接激活,则会出现下面的图样:

linux 下ssh 服务配置_linux_13

这个时候可以填入你要连接上去的主机名称,例如我的区域内网络 test.linux.org 这个主机:

linux 下ssh 服务配置_休闲_14

呵呵!这样就登入主机啦!很简单吧!然后其它的使用方式跟前面提到的 sftp 一样哩!加油的使用吧!
------------------------------------------------------------------------------------------------

详细设定 sshd 服务器


基本上,所有的 ssh 相关设定都放在 /etc/ssh/sshd_config 里面!不过,每个 Linux distribution 的预设设定都不太相同,所以我们有必要来了解一下整个设定值的意义为何才好!

linux 下ssh 服务配置_ssh_15
linux 下ssh 服务配置_服务配置_16
linux 下ssh 服务配置_服务配置_17
linux 下ssh 服务配置_系统_18
linux 下ssh 服务配置_系统_19

基本上,在你的系统中,『除非有必要,否则请不要更改 /etc/ssh/sshd_config 这个档案的设定值!』因为预设的情况下通常都是最严密的 SSH 保护了,因此,可以不需要更动他!上面的说明仅是在让大家了解每个细项的一些基本内容而已!需要注意的是最后一项,如果您不愿意开放 SFTP 的话,将最后一行批注掉即可!

另外,如果你修改过上面这个档案(/etc/ssh/sshd_config),那么就必需要重新激活一次 sshd 这个 daemon 才行!亦即是: /etc/rc.d/init.d/sshd restart
------------------------------------------------------------------------------------------------

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


咦!既然 SSH 可以使用 Key 来比对资料,并且提供使用者资料的加密功能,那么可不可能利用这个 Key 就提供使用者自己进入主机,而不需要输入密码呢?呵呵!好主意!我们可以将 Client 产生的 Key 给他拷贝到 Server 当中,所以,以后 Client 登入 Server 时,由于两者在 SSH 要联机的讯号传递中,就已经比对过 Key 了,因此,可以立即进入数据传输接口中,而不需要再输入密码呢!在实作上的步骤可以是:

1. 首先,先在 Client 上面建立 Public Key 跟 Private Key 这两把钥匙,利用的指令为 ssh-keygen 这个命令;

2. 再来,将 Private Key 放在 Client 上面的家目录,亦即 $HOME/.ssh/ ,并且修改权限为仅有该 User 可读的状态;

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

说是好象很困难的样子,其实步骤真的很简单,我们依序来进行作业好了!

假设前提:


a. Server 部分为 test.linux.org 这部 192.168.0.2 的主机,欲使用的 User 为 test 这个帐号;

b. Client 部分为 test2.linux.org 这部 192.168.0.100 PC 的 test2 这个帐号,他要用来登入
192.168.0.2 这部主机的 test 这个帐号。

也就是说,我在 192.168.0.100 这部机器的身份为 test2 ,但是我想以 test 的身份登入 192.168.0.2 这部主机,并且希望不要使用密码!这样可以了解大前提了吗?好了,我们就一步一步来作吧!

1. 在 Client 端建立 Public 与 Private Key :

建立的方法真的是简单到不行!直接在 192.168.0.100 这个 Client 上面,以 test2 这个帐号,使用 ssh-keygen 这个指令来进行 Key 的产生即可!不过,需要注意的是, version 1 与 version 2 使用的密码演算方式不同,此外, version 2 提供两个密码演算的方法,我们这里仅针对 version 2 的 RSA 这个演算方法进行说明!

linux 下ssh 服务配置_系统_20

请注意上面喔,我的身份是 test2 ,所以当我执行 ssh-keygen 时,才会在我的家目录底下的 .ssh/ 这个目录里面产生所需要的两把 Keys ,分别是私钥(id_rsa)与公钥(id_rsa.pub)。另外一个要特别注意的就是那个 id_rsa 的档案权限啦!他必须要是 -rw------- 才好!否则内容被人家知道了,那么你的 Keys 不就有可能外泄了?所以请特别留意他的权限喔!那么那个 id_rsa.pub 则是『公钥!』这个档案必须要被放置到 Server 端才行!

2. 在 Client 端放置私钥:

在预设的条件中,我们的私钥必需要放置在家目录底下的 .ssh 里面,那么如果是 version 2 的 RSA 算法,就需要放置在 $HOME/.ssh/id_rsa 当中!咦!刚好使用 ssh-keygen 就是已经产生在这个目录下了,所以自然就不需要去调整他了!以我的 test2.linux.org 来看,那么我的档案就会放置在 /home/test2/.ssh/id_rsa 这个档案就是私钥啦!

3. 在 Server 端放置可以登入的公钥:

既然我们要让 test2 可以以 test 这个帐号登入 test.linux.org 这部主机,那么这部主机自然需要保有 test2 的 public key 啰!对的!所以我们必需要将 Client 端建立的 id_rsa.pub 档案给他拷贝到 test.linux.org 里头的 test 这个使用者的家目录之下!那么如果你还记得上面的 sshd_config 这个档案的设定的话,那么应该就记得『AuthorizedKeysFile』这个设定吧!是的!在被登入的主机的某个帐号,他的公钥放置的文件名称预设 就是这个项目所记载的!而他预设的档名就是 authorized_keys 这个文件名称啦!那么应该怎么做呢?
linux 下ssh 服务配置_系统_21
   请注意上面的机器!由于 authorized_keys 可以保存相当多的公钥内容,因此,可以使用 >> 的方式来将 Client 端的公钥新增到该档案内!呵呵!做完这一步一后,未来 test2 就可以直接在 test2.linux.org 以

linux 下ssh 服务配置_休闲_22

这样就可以不需要输入密码啰!但是请注意, test 不能以 test2 登入 test2.linux.org 喔!

很简单的步骤吧!这样一来,就可以不需密码的手续了!无论如何,你要记得的是, Server 需要有的是 Public Keys ,而 Client 端的则是 Private Keys !则未来,当你还想要登入其它的主机时,只要将你的 public key ( 就是 id_rsa.pub 这个档案 )给他 copy 到其它主机上面去,并且新增到某帐号的 .ssh/authorized_keys 这个档案中!哈哈!成功!
------------------------------------------------------------------------------------------------

· 安全设定:


好了,那么关于安全的设定方面,有没有什么值得注意的呢?当然是有啦!我们可以先建议几个项目吧!分别可以由:

o /etc/ssh/sshd_config

o /etc/hosts.allow, /etc/hosts.deny

o iptables

这三方面来着手进行!底下我们就说一说吧!

· /etc/ssh/sshd_config


一般而言,这个档案的预设项目就已经很完备了!所以,事实上是不太需要更动他的!但是,如果您有些使用者方面的顾虑,那么可以这样修正一些问题呢!

o 禁止 root 的登入:任何时候,不许 root 以远程联机的方式登入,都会是一个好主意!所以这里蛮建议大家直接将 root 的登入权限拿掉吧!所以,可以修改 /etc/ssh/sshd_config 这个档案的内容为:

linux 下ssh 服务配置_系统_23

如此一来,以后 root 就不能以 ssh 登入啰!这样还是比较好的啦! ^_^

o 不许某个群组登入:有些特殊情况中,我们想要让使用者只能使用 sendmail, pop3, ftp 等,但是不希望他可以远程联机进来,那么你可以这样做:

1. 将这些使用者都归纳在某一个特殊群组之下,例如 nossh 这个群组好了;

2. 在 /etc/ssh/sshd_config 当中加入这一行:『DenyGroups nossh』

3. 重新激活 sshd : /etc/rc.d/init.d/sshd restart
这样就OK啦!

o 不许某个使用者登入:跟 DenyGroups 类似,使用 DenyUsers 即可!参考 sshd_config 的设定喔!

· /etc/hosts.allow 及 /etc/hosts.deny :


这东西也是很简单的啦!直接参考: 简易防火墙架设 一文啰!当然,简单的方法就是:

linux 下ssh 服务配置_linux_24

· iptables


基本上, SSH 还蛮安全的,只要取消 root 的登入权限,那么问题应该就会比较小一点啦!所以,虽然可以不用设定 iptables ,但是建议针对几个网域设定一下 /etc/hosts.allow 与 /etc/hosts.deny !加油啰!