since2012/04/23

     
 
简易 Telnet 与 SSH 主机设定
本文已不再维护,更新文章请参考此处
最近更新日期:2003/09/09
一部连上 Internet 上面的您的个人主机,最重要的是什么呢?大概就是如何让您自己可以联机进入自己的主机,并且进行所谓的『远程操控』了吧!也就是说,您可以在任何具有连上 Internet 的计算机中,以远程联机软件连上 Internet ,并藉由您主机上面的远程联机服务器软件提供的功能,直接登入您的主机来进行操控的工作!此时,您将发现 Linux 有趣又好玩的地方啰!在 Unix Like 的机器当中,几乎都提供 Telnet 这个远程联机服务器软件,不过, Telnet 本身是以『明码』来传送您操作的数据,安全上面是值得来思考要不要开放吶!这个时候就有需要了解一下传送过程中以加密动作来传送数据封包的 SSH 这个远程联机服务器软件啦!这个章节当中,我们会提到 Telnet 与 SSH 这两个服务器,值得参考喔!

远程联机程序的功能
Telnet 服务器
  telnet 服务器:安装、启动与关闭服务
  telnet 客户端:好用的联机软件
  telnet 安全性:iptables, TCP_Wrappers, 纯建议,
SSH 服务器
  联机加密技术简介
  启动 ssh 服务
  ssh 客户端联机ssh, sftp, putty,
  详细设定 sshd 服务器:/etc/ssh/sshd_config
  制作不用密码可立即登入的 ssh 用户: ssh-keygen,
  安全设定: sshd_config, iptables, TCP_Wrappers,

参考资源
课后练习

大标题的图示远程联机程序的功能:
    在这个章节当中,首先,我们要先来了解一下,什么是『远程联机服务器』?这个东西的功能为何?我想,您应该已经听过,一个良好的网络环境当中,一部开放到 Internet 上面的服务器,基本上,他可以不需要显示适配器、屏幕、键盘、鼠标等等的配备!只要有基本的主板、CPU、RAM、硬盘再加上一块好一点的网络卡,并且连上 Internet !哈哈!那么您要操控这部主机的时候,只要透过网络联机进来,然后进行任何修改即可!嘿!所以啰,这个时候主机自然不需要接口设备啦!
     
    以鸟哥个人为例,目前鸟哥管理大约七、八部左右的 Unix-Like 主机,这些主机都不在同一个地方,分布在南台湾各处!那么当有新的套件的漏洞被发布,或者是需要进行一些额外的设定的时候, 是否鸟哥本人一定要到现场吗?当然不需要, 只要透过网络联机到该主机上面,就可以进行任何工作了!真的就好像在屏幕前面工作一般的轻松愉快!^_^!这就是远程联机服务器啦!远程联机服务器的功能 当然还不只如此!举个例子来说:当您的工作需要使用到 Linux 的强大的编译功能时,那么您一定需要 Linux 对吧!而且最好是指令周期快一点的主机,这个时候您可以将您研究室最快的那一部主机开放出来,设定一下远程联机服务器,让您的学生啦,或者是研究室的同仁 啦,可以透过这部机器帮他们进行研究的工作,这个时候,您的主机就可以让多人进行分享 Linux 运算的功能啦!
     
    在早期的网络世界里,由于只有 Unix 机器,而且个人计算机还不流行的时候,想要使用大型主机来进行数值程序的运算时(在我们工程界,比较常使用 Fortran 这一类的程序语言,至于 C 语言则较少碰~),就需要向学校单位申请工作站的账号,并且以远程联机程序连进主机,以使用 Unix 的资源来进行我们的数值模式运算!所以啦,那个远程联机服务器的设定,基本上,对于系统管理员是很重要的!尤其对于大型的工作站类型的 Unix-Like 主机,由于很多人都需要使用到他的 CPU 运算核心功能,或者是他的编译程序( compiler )来进行运算,这时的远程联机就更形重要啦!
     
    那么是否每一部连上 Internet 上面的主机都应该要开放远程联机的功能呢?其实并不尽然,还是需要针对您的主机来进行规划的,我们底下分服务器与工作站来说明:
     
    • 服务器类型( Server )的联机程序

    • 在一般开放因特网服务的服务器中,由于开放的服务可能会有较为重要的信息,而远程联机程序连进主机之后,可以进行的工作又太多了(几乎就像在主机前面工作一般!),因此因特网的远程联机程序通常仅针对少部分系统维护者开放而已!除非必要,否则 Server 类型的主机还真的不建议开放联机的服务呢!以鸟哥为例,我的主机提供了我们研究室使用 Mail 与 Internet 上面的 WWW 服务,如果还主动提供远程联机的话,那么万一不小心被入侵,那可就伤脑筋了!因此,鸟哥仅开放『很小部分的网域』让系统管理员连进来,其他来源的 IP 一律抵挡!不许使用远程联机的功能呢!
       
    • 工作站类型( Workstation )的联机程序

    • 至于工作站的情况就跟服务器不太一样了!工作站常常仅针对内部的几个使用者开放而已,通常是不希望连上 Internet 的啦!而且所谓的工作站自然就是用来做工的!例如鸟哥的其中一部 Linux 就是专门用来进行大型的数值模式计算仿真之用!这个时候的远程联机服务器可能就得要对多人启动了!因为工作站的强大运算功能可以让很多人一同使用他的计算能力!而且也可以免除每部计算机都得要安装 compiler 的窘境!要知道,某些工程用的 compiler 是粉贵的~
       
    那么目前远程联机服务器的主要类型有哪些呢?目前最常见的远程联机服务器主要有以『明码』传送数据的 telnet 服务器,及以加密技术进行封包加密来传送的 SSH 服务器!虽然 telnet 可以支持的 client 端的软件比较多,不过由于他是使用明码来传送数据,很容易遭到有心人士的撷取!所以近来我们都呼吁大家多使用 SSH 这一种联机方式,而舍弃掉 telnet 这个比较不安全的咚咚啰!底下我们就分别来谈一谈这两种联机服务器吧!
     
    好了,那么什么是『明码』呢?为什么 telnet 使用明码就比较不安全?所谓的明码就是:当我们的数据封包在网络上流窜时,该数据封包的内容为数据的原始格式,例如我们在 telnet 下达的指令与密码等等,都会以类似 ASCII 的格式传送到主机端,而主机端就藉由这些数据来下达指令。好了,想一想,如果这些数据封包在经过某些 broadcast 或者是 Router 时,被有心人士捉去,那么他将会完整的取得您的数据喔!所以啦,万一您的数据封包里面含有信用卡数据、密码、身份确认等重要信息时,是否很危险吶?!因 此,目前我们通常都希望使用可以将这些在网络上面跑的数据加密的技术,以增加数据在 Internet 上面传送的安全性啊!

大标题的图示Telnet 服务器:
    知道 telnet 是什么吗?咦!不就是连接 BBS 的工具吗?!嘿嘿!没错!他确实也是 BBS 软件类的一个服务器啦!不过这里我们暂不玩弄 BBS ! telnet 可以说是历史相当悠久的远程联机服务器哩!而且支持他的软件也相当的多!例如知名的 netterm 就直接支持他啦!联机之后的界面也漂亮,在 client 端的中文传输与输入也没有问题!相当的不错用!不过,他最麻烦的地方就是.....比较不安全而已啦~
     
    底下我们谈一谈怎么启动与使用 telnet 服务器吧!

    telnet 服务器:安装、启动与关闭服务
     
    安装:
    如何启用 Telnet 这个好用的服务器呢?首先,当然一定要有安装啰!由于近年来由于 telnet 是以明码在传输的问题,所以在新的 Linux 版本上面,已经都将 telnet 这个服务器排除在『先发名单』之外啦,也就是说,很多 Linux distributions 预设是不安装 telnet 的,不过,在每个主要的 Linux distributions 还是有提供 telnet 套件在光盘当中啦!所以您要拿出原版光盘,并且安装好他,就可以啦!如何确认是否已经安装了 telnet 呢?最简单的方法就是使用最广泛被使用的 RPM 啦!
     
    [root@test root]# rpm -qa | grep telnet
    telnet-server-krb5-1.2.5-1mdk
    telnet-client-krb5-1.2.5-1mdk
    # 上面是 Mandrake 9.0 的范例;或底下是 Red Hat 7.2 的范例
    telnet-0.17-20
    telnet-server-0.17-20
     
    需要特别留意的是,如果要提供 telnet 联机服务,通常需要安装两个 RPM 喔:
     
    1. 一个是 telnet-client (或 telnet),这个套件提供的是 telnet 客户端的联机程序;
    2. 另一个是 telnet-server 套件,这个才是真正的 Telnet server 软件喔!
     
    所以,如果您的系统上面找不到等一下要设定的 telnet 配置文件,肯定就是没有安装 telnet 啦!请拿出您的光盘片,然后 mount 之后,赶紧的安装他吧!否则就无法进行下一步的设定啦! ^_^
     
    启动与关闭:
    还记得『鸟哥的 Linux 私房菜 -- 基础学习篇』里面的『认识服务 ( daemon )』那个章节吧!?要记得 super daemon 呦!?没错啦,我们的 telnet 就是挂在 super daemon 底下的一支服务而已!那个咚咚就是有名的 xinetd 啰!( 注:在某些旧版的套件上面也有使用 inetd 的,启动的方式有点不太一样,不过差异不大啦!只要懂得基本的常识,那么就不会有问题啰!所以鸟哥才会要大家先读完 Linux 基础篇 啦! ) 启动的方式就是:
     
      (1)将 xinetd 里面关于 telnet 的项目开启,然后
      (2)重新启动一次 xinetd 就成功啦!
     
    那么如何开启 telnet 的项目呢?很简单,有两个方式:
     
    1. 使用 ntsysv 或 chkconfig

    2. 还记得小红帽 ( Red Hat ) 里面的 ntsysv 这个好用的东西吗?对了,在 Red Hat 底下有这么一个好用的设定工具,您可以使用 ntsysv 出现的窗口之中,将 telnet 勾选起来,然后按下 OK 离开即可啰!
       
    3. 使用 vi 修改 /etc/xinetd.d/telnet 这个档案:

    4. 那么如果不是 Red Hat 的 Linux 系统呢?基本上, ntsysv 也只是修改 /etc/xinetd.d 这个目录下的数据而已,所以我们当然可以手动自己修改他啦!
      [root@test root]# vi /etc/xinetd.d/telnet
      # default: on
      # description: The telnet server serves telnet sessions; it uses \
      #       unencrypted username/password pairs for authentication.
      service telnet
      {
            disable = yes<==就是改这里,将 yes 改成 no 即可!
              flags           = REUSE
              socket_type     = stream
              wait            = no
              user            = root
              server          = /usr/sbin/in.telnetd
              log_on_failure  += USERID
      }
      看到了没!?只要将 disable (取消的意思) 变成 no ,也就是不取消,亦即是开启啦!
     
    设定完开启之后,自然就是要启动啦,刚刚提到 telnet 是挂在 xinetd 底下的,所以自然只要重新启动 xinetd 就能够将 xinetd 里头的设定重新读进来,所以刚刚设定启动的 telnet 自然也就可以被启动啦!而启动的方式也有两种方式,其中 service 这个指令仅支持在 Red Hat 与 Mandrake 底下,所以通常我还是以 /etc/rc.d/init.d 底下的 scripts 为启动的主要方法啦!
       
      方法一:仅支援 Red Hat 或 Mandrake 系统:
      [root@test root]# service xinetd restart
      Stopping xinetd:                                           [  OK  ]
      Starting xinetd:                                           [  OK  ]

      方法二:正统的启动方式:
      [root@test root]# /etc/rc.d/init.d/xinetd restart
      Stopping xinetd:                                           [  OK  ]
      Starting xinetd:                                           [  OK  ]
      # 注意:有的某些版本并没有 restart 的选项,这个时候就需要:
      # stop 再 start 啰!

       
    那么要看有没有启动服务呢?怎么看?其实也很简单啦,还记得我们在前几章提到的『 限制 Linux port 的联机 』那一章吗?使用 netstat 就可以啦!
       
      [root@test root]# netstat -tl
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State
      tcp        0      0 *:ssh                   *:*                     LISTEN
      tcp        0      0 *:telnet                *:*                     LISTEN
       
    看到了吗?没错,那个 telnet 就是启动的项目啦!( 这里考一个问题,那个 port 对应的服务名称在哪一个档案里面查询到的呢?在每一个 Linux 系统都有的档案呦!忘记了呀!?再回到前面看看 限制 Linux port 的联机 ,然后用 vi 去看看那一个档案的内容吧! ^_^ )那么要如何关闭呢?呵呵!那就真的是太简单啦!就将刚刚的步骤再做一次,而将设定值转变一下即可!步骤如下啦!
       
      step 1: 修改一下 /etc/xinetd.d/telnet 档案:
      [root@test root]# vi /etc/xinetd.d/telnet
      # default: on
      # description: The telnet server serves telnet sessions; it uses \
      #       unencrypted username/password pairs for authentication.
      service telnet
      {
            disable = no<==就是改这里,将 no 改成 yes 即可!
              flags           = REUSE
              socket_type     = stream
              wait            = no
              user            = root
              server          = /usr/sbin/in.telnetd
              log_on_failure  += USERID
      }

      step 2: 重新启动 xinet 即可:
      [root@test root]# /etc/rc.d/init.d/xinetd restart

       
    这样就关掉啦!很简单吧!
     

    telnet 客户端:好用的联机软件
     
    刚刚上面提到的都是在服务器端的设定而已!那么在客户端有什么好用的软件可以连上 Server 的呢?最常见到的应该就是 netterm 这个鼎鼎大名的联机软件了吧!我想,只要玩过 BBS 的大概都晓得这个软件才对!所以这里就不提了!另外,目前几乎所有的操作系统都提供了 telnet 这个程序,这个程序可以直接轻易的就连上 telnet server 呢!例如您要在 Linux 上面连上自己的 telnet 服务器,可以这样做:
       
      [root@test root]# telnet localhost
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      Red Hat Linux release 7.2 (Enigma)
      Kernel 2.4.18 on an i586
      login: test <==输入账号
      Password: <==输入密码请注意!密码并不会在屏幕上面显示任何的字眼
      Last login: Thu Oct  3 11:59:29 from test_inside   <==提示上次登入的地址
      You have new mail.  <==自上次登入以来,是否信箱内有新信件!?
      [test@test test]$  <==这里就进入了 telnet 的联机程序当中了!
      [test@test test]$ exit  <==离开这次 telnet 的登入!
       
    这样就联机进来啦!很简单吧!那么在 Windows 的环境底下呢?同样的,也是可以使用 telnet 的程序联机到 Linux 的 telnet server 里面来!没有问题的啦!可以依序这样做:
     
    1. 按下 Windows 内的 『开始』
    2. 选择 『执行』
    3. 在出现的窗口中输入 『telnet your.IP.or.hostname』
     
    这样就可以进入 Linux 的环境中了!很方便吧!当然啦!您也可以使用类似 netterm 这个很棒的联机软件来联机的,这里我们就不示范啦!那如果想要在 Linux 的终端机看到中文呢?!呵呵!这就需要 JMCCE 这个套件的支持了!请参考:Linux 常用指令介绍之终端机中文接口显示
     

    telnet 安全性:iptables, TCP_Wrappers, 纯建议,
     
    telnet 这个服务器方便归方便,但总是一个不太好的联机解决方案,因为毕竟他是一个以『明码』传输的协议,什么是『明码』呢?简单的说,当您使用 telnet 的时候,您总是会在屏幕上面输入数据吧!?最简单的例子,就是您总是要登入 telnet 的主机画面吧!那么您总是需要输入账号与密码吧?当主机接受您的数据后才能进行确认!这个时候,您的资料就会经过 telnet 这个协议来传输到主机上面,这个传输时候的数据基本上是没有加密过的,也就是类似 ASCII 码的咚咚!如此一来的话,只要有心人士在某个 router 点去监听您的封包,而且将该数据封包捉下来,进行解读的工作,哈哈!那么您的账号与密码就被拿走了!所以下一次,别人就可以利用您的账号与密码了~很危险对不对~是很危险!除此之外, telnet 由于太老牌了,很多的黑客程序已经都写了破解的方式,所以启动之后,其实也很危险的啦!因此实在是建议不要启用 telnet 说!无论如何,有些朋友由于旧软件的关系,还是需要使用到 telnet 来联机,那么我们就提一些基本的注意事项好了!
     
    • 以比较限制的配置文件来规范联机的 IP :

    • 事实上, xinetd 这个 super daemon 提供的些许的保护措施了,您可以针对您的主机的多重接口(有对内以及对外喔!)来提供不同保护等级的措施!底下列出一个范例,不过,更多的信息请再回到『鸟哥的 Linux 私房菜 -- 基础学习篇』当中去查阅一下『认识服务 』那一章里面的详细设定说明吧!
      [root@test root]# vi /etc/xinetd.d/telnet
      # This file had been modified by VBird 2002/11/04
      # First is about inside the network
      service telnet
      {
              disable         = no
              bind            = 192.168.1.2
              only_from       = 192.168.1.0/24 
              # 上面这两行说明仅提供内部网域!
              instance        = UNLIMITED
              nice            = 0
              flags           = REUSE
              socket_type     = stream
              wait            = no
              user            = root
              server          = /usr/sbin/telnetd
              server_args     = -a none
              log_on_failure  += USERID
      }

      # Second is about the outside domain's settings
      service telnet
      {
              disable         = no
              bind            = 140.116.142.196
              only_from       = 140.116.0.0/16
              no_access       = 140.116.32.{10,26} 
              # 上面这三行设定外部较为严格的限制
              instance        = 10
              umask           = 022
              nice            = 10
              flags           = REUSE
              socket_type     = stream
              wait            = no
              user            = root
              server          = /usr/sbin/telnetd
              server_args     = -a none
              log_on_failure  += USERID
      }

       
    • root 不能直接以 telnet 连接上主机:

    • 既然 telnet 不是很安全,自然预设的情况之下就是无法允许 root 以 telnet 登入 Linux 主机的!但是,事实上, telnet 只是利用一些较为安全的机制来防止 root 登入而已~所以啰,假如您确定您的环境够安全(例如您的主机并没有连上 Internet ),并且想要开放 root 以 telnet 登入 Linux 主机的话,请直接将 /etc/securetty 更改檔名即可!
      [root@test root]# mv /etc/securetty /etc/securetty.bak
      这样一来,root 就可以登入啦!不过,相当的不建议这样做喔!毕竟不是很安全啦!此外,您也可以藉由修改 pam 模块来达成同样的功能!修改 /etc/pam.d/login 这个档案的第二行设定即可:
      [root @test /root]# vi /etc/pam.d/login
      #%PAM-1.0
      #auth       required     /lib/security/pam_securetty.so 
      # 将上面这一行加上 # 批注掉!
      auth       required     /lib/security/pam_stack.so service=system-auth
      auth       required     /lib/security/pam_nologin.so
      account    required     /lib/security/pam_stack.so service=system-auth
      password   required     /lib/security/pam_stack.so service=system-auth
      session    required     /lib/security/pam_stack.so service=system-auth
      session    optional     /lib/security/pam_console.so
      如此一来, root 将可以直接进入 Linux 主机了!不过,还是不建议如此做的
       
    • 加上防火墙 iptables:

    • 针对 telnet 加设防火墙 iptables 是一个好主意!如果您已经参考了前面章节提到的『简易防火墙架设』一文,并且使用里面的 scripts 的话,那么不用担心 telnet 啦!基本上,他原本就仅对内部开放 telnet ,外部是无法连上您的 telnet 的!但是,若是您自己设定了自己的防火墙机制之后,那么想要针对 192.168.0.0/24 这个网域,及 61.xxx.xxx.xxx 这个 IP 进行 telnet 的开放呢?可以增加这几行在您的 iptables 规则之内(请注意:防火墙的规则顺序是很重要的!所以再回头看看 简易防火墙架设 一文是有必要的!)
      /sbin/iptables -A INPUT -p tcp -i eth0 -s 192.168.0.0/24 --dport 23 -j ACCEPT
      /sbin/iptables -A INPUT -p tcp -i eth0 -s 61.xxx.xxx.xxx --dport 23 -j ACCEPT
      /sbin/iptables -A INPUT -p tcp -i eth0                   --dport 23 -j DROP
      上面的规则中,第一、二行是针对来源的 IP 来开放 port 23 亦即是 telnet 的协议啦!而最后一行则是将其他的所有来源的,想要连上 telnet 的联机封包都丢掉的意思!怎么样!很简单吧!
       
    • 加上防火墙 /etc/hosts.allow(deny) 机制:

    • 防火墙的机制是越多越好!永远也不嫌多的啦!这里也可以使用 TCP_Wrappers 的机制呢!刚刚是开放了 192.168.0.0/24 这个网段,但是如果您只想要其中的 192.168.0.1 ~ 192.168.0.5 进入呢?而其他的 IP 只要一经联机,就会被记录该 IP ,以提供 root 查询呢?可以这样做:
      [root@test root]# vi /etc/hosts.allow
      in.telnetd: 192.168.0.1, 192.168.0.2, 192.168.0.3, 192.168.0.4, 192.168.0.5: allow

      [root@test root]# vi /etc/hosts.deny
      in.telnetd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \ 
      /bin/echo; /usr/sbin/safe_finger @%h ) | \ 
      /bin/mail -s "%d -%h security" root@localhost & \ 
      : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允许登入,您的联机将会被纪录,并且作为以后的参考\n\n ". ) 

      更详细的 TCP_Wrappers 用法请参考 简易防火墙架设 一文啰!
       
    • 建议事项:

    • 说真的, telnet 真的不是很安全的!简直应该说为『危险』等级的服务,所以尽量不要启动他啦:
      1. 非必要时,不要启动 telnet ,如果真的需要启动 telnet ,那么也请在启动并且使用完毕之后,立即将他关掉!
      2. 如果确定真的要启动 telnet 时,请确定好限制的联机范围,使用 iptables 来设定联机的限制区域;
      3. 加上 TCP_Wrappers 的辅助,加强防火墙的功能!
      4. 随时注意登录档案里面关于 login 的事项!并且不要让 root 能以 telnet 登入 Linux 主机!

大标题的图示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 服务器主机启动该服务之后,主机端会产生一支公钥,而身为个人计算机的您 ( client 端 ),在进行与 server 的联机时,可以藉由 Client 端随机自行产生的私钥来提供 server 的联机之用,也可以直接藉由 server 提供的私钥来进行联机!这个与进行联机时选择的加密版本有关,等一下我们再提!
     
     
    在上面的图示中,我们可以知道,当资料由 Server 端传送到 Client 端时,这些数据会先经过『公钥, Public Key』来进行加密的行为,所以,在传输的过程中,这些数据本身是经过加密的,因此,即使这些数据在途中被截取时,要破解这些加密的数据,还是得要花费上好长一段时间的。那么等这些经过公钥加密的数据传送到 Client 端之后,就可以藉由所谓的『私钥, Private Key』来进行解密的动作。需要注意的是,这些公钥与私钥在每一部计算机上面都不一样,所以,您与 Server 的联机对其他人来说,都是很难去破解的呢!那么这些公钥与私钥是如何产生的呢?底下我们来谈一谈目前 SSH 的两种版本的联机模式啰!
    • 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 可能就会不一样啦!
       
    • 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 来联机时,比较建议使用 version 2 的算法喔!)
     

    启动 ssh 服务:
     
    事实上,在我们使用的 Linux 系统当中,默认就已经含有 SSH 的所有需要的套件了!这包含了可以产生密码等协议的 OpenSSL 套件与 OpenSSH 套件,所以呢,要启动 SSH 真的是太简单了!就直接给他启动就是了!此外,在目前的 Linux Distributions 当中,都是预设启动 SSH 的,所以一点都不麻烦,因为不用去设定,他就已经启动了!哇!真是爽快~无论如何,我们还是得说一说这个启动的方式吧!直接启动就是以 SSH daemon ,简称为 sshd 来启动的,所以,手动可以这样启动:
     
    [root@test root]# /etc/rc.d/init.d/sshd start
    [root@test root]# service sshd start
    [root@test root]# netstat -tl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 *:ssh                   *:*                     LISTEN
     
    上面两种方式都可以直接手动启动 sshd 这个服务!然后使用 netstat -tl 看看能不能看到 ssh 的服务在监听呢!?如果出现了上面那一行斜体字,就表示您的 SSH 已经正确的启动啰!这真是太简单了吧!没错,但是他就是这么简单~
     
    那么我要如何在开机的时候就启动这个 sshd 呢?如果是 Red Hat 的系统,可以使用 ntsysv 这支程序,而 Mandrake 可以使用 chkconfig 这个程序!至于 OpenLinux 则可以到 /etc/sysconfig/daemons 去看看喔!
     
    这个方式仅适合在已经有 OpenSSH 的 Linux Distributions 当中,如果以 Red Hat 6.x 为例,他并没有预设使用 SSH 怎么办?别担心,可以参考一下底下这个鸟哥之前写过的网页,有详细的说明使用 tarball 安装的步骤呢!
    需要注意的是, SSH 不但提供了 shell 给我们使用,亦即是 ssh protocol 的主要目的,同时亦提供了一个较为安全的 FTP server ,亦即是 ssh-ftp server 给我们当成是 FTP 来使用!所以,这个 sshd 可以同时提供 shell 与 ftp 喔!而且都是架构在 port 22 上面的呢!所以,底下我们就来提一提,那么怎么样由 Client 端连接上 Server 端呢?同时,如何以 FTP 的服务来连接上 Server 并且使用 FTP 的功能呢?
     

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

    • 在 Linux 客户端方面,我们主要以 ssh 进行一般联机,而以 sftp 进行 FTP 的使用联机!分别简介如下:
       
      ssh 一般联机的使用方式:
      [root@test root]# ssh user@hostname
      [root@test root]# ssh -l test test.linux.org
      Connecting to test.linux.org...
      The authenticity of host 'test.linux.org (192.168.1.100)' can't be established.
      RSA key fingerprint is 46:cf:06:6a:ad:ba:e2:85:cc:d9:c4:8d:15:bb:f3:ec.
      Are you sure you want to continue connecting (yes/no)? yes <==请输入 yes !
      Warning: Permanently added 'test.linux.org,192.168.1.100' (RSA) to the list of known hosts.
      test@test.linux.org's password:    <==请输入 test 这个用户的密码!
       
      这里请特别留意的是,如果直接以『 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 这支程序默认会将主机端的 public key 记录下来,放置在 /home/youraccount/.ssh/known_hosts 当中,以利未来的联机之用。不过,由我们刚刚对于联机加密机制的探讨当中,可以发现在 SSH 主机重新启动之后,那个 Public Key 会自动的更新,所以,当您的 SSH 主机经过重新启动,而您的 Client 再以 ssh 这支程序联机时,就会发现如下的错误喔:
       
      [root@test root]# ssh user@hostname
      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      @    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
      6e:1a:60:d0:ee:d0:7c:91:df:94:de:09:35:7b:08:ba.
      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:8
      RSA host key for hostname has changed and you have requested strict checking.
      Host key verification failed.
       
      这个错误讯息在告诉您,上次所登录的远程 SSH 主机的 Keys 已经被改过了(最可能的原因就是重新启动啦!),所以无法继续登入~呵呵!这个时候怎么办?很简单啊!进入您的家目录的 ~/.ssh 里面,编辑一下 known_hosts ,将欲连接的主机名的 Key 给他消除,就可以重新联机啦!
       
      那么如何使用 SSH FTP 的功能呢?也是很容易啦!就是使用 sftp 这支程序即可!而登入的方式与 ssh 相同,都是使用 sftp -l username hostname 或者直接以 sftp user@hosname 来书写!执行之后会有底下的模样:
       
      sftp 一般联机的使用方式:
      [root@test root]# sftp test@test.linux.org
      test@test.linux.org's password:    <==请输入 test 这个用户的密码!
      sftp>  <==等待您输入指令!
       
      进入到 sftp 之后,那就跟在一般 FTP 模式下的操作方法没有两样了!底下我们就来谈一谈, sftp 这个接口下的使用指令吧!
       
      针对远方主机(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
      bye
      针对本机(Client)之行为(都加上 l, L 的小写 )
      变换目录到本机的 PATH 当中 lcd PATH
      列出目前本机所在目录下的文件名 lls
      在本机建立目录 lmkdir
      显示目前所在的本机目录 lpwd
      文件传输
      将档案由本机上传到远程主机 put [本机目录或档案] [远程]
      put [本机目录或档案]
      如果是这种格式,则档案会放置到目前远程主机的目录下!
      将档案由远程主机下载回来 get [远程主机目录或档案] [本机]
      get [远程主机目录或档案]
      若是这种格式,则档案会放置在目前本机所在的目录当中!可以使用通配符,例如:
      get *
      get *.rpm
      亦是可以的格式!
       
      就整体而言, sftp 在 Linux 底下,如果不考虑图形接口,那么他已经可以取代 FTP 了呢!因为所有的功能都已经涵盖啦!因此,在不考虑到图形接口的 FTP 软件时,可以直接关掉 FTP 的服务,而改以 sftp-server 来提供 FTP 的服务吧! ^_^
    • Windows 客户端

    • 在 Linux 底下已经有 ssh 了,那么如果在 Windows 底下呢?该怎么办?呵呵!这个可以直接使用 putty 这种类型的联机软件呢,他也是免费的软件喔!取得的方式可以参考底下的网站:
      好了,那么要取得哪几个程序呢?其实只要 putty.exe 及 psftp.exe 这两支程序就够了!分别用来登入 shell 及 FTP 的呢!
      • putty:

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

        这个时候请注意,由于我们比较喜欢将固定的几个主机的IP记录下来,所以在这里我们需要先进行一些基本的设定才行!在上图中,我们需要填写:
          (1)HostName(or IP address) 那一项,及
          (2)Saved Sessions 取个好记的名字,
          (3)并且选择 SSH 那个选项才行!
        以我的区域内网络为例,我可以写成这个模样:

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

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

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

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

        整个 putty 大致上的流程就是这样!如此一来,您就可以在 Windows 上面以 SSH 的协议,登入远程的 Linux 主机噜!粉方便吧! ^_^ !如果还要其他的设定,那么就直接修改 Saved Sessions 与 HostName 这两个项目,然后再次给他 Save ,嘿嘿!就又多一个设定值了!而且还是跟刚刚的设定值相同!很容易设定的啦!那么如果想要中文支持的话,目前 putty 已经支持中文啦!您可以输入中文喔!不过需要修改一下字符集,选择左边画面的『window』项目,并选择『Appearance』设定内容,设定:

        在出现的上面框框中,选择右边第二个项目内的『Change』去修改字符集显示:

        将(1)字型设定为细明体(2)字集设定为『Big5』,如此一来,您的 putty 就支持中文的输入啰! ^_^
      • psftp:

      • 这一支程序的重点则是在于以 sftp 联机上 Server 。联机的方式可以直接点选 psftp 这个档案,让他直接启动,则会出现下面的图样:
        psftp: no hostname specified; use "open host.name" to connect
        psftp> 
        这个时候可以填入您要连接上去的主机名,例如我的区域内网络 test.linux.org 这个主机:
        psftp: no hostname specified; use "open host.name" to connect
        psftp> open test.linux.org
        login as: test
        Using username "test".
        test@test.linux.org's password:
        Remote working directory is /home/test
        psftp>
        呵呵!这样就登入主机啦!很简单吧!然后其他的使用方式跟前面提到的 sftp 一样哩!加油的使用吧!
     


    详细设定 sshd 服务器
     
    基本上,所有的 ssh 相关设定都放在 /etc/ssh/sshd_config 里面!不过,每个 Linux distribution 的预设设定都不太相同,所以我们有必要来了解一下整个设定值的意义为何才好!
     
    # 1. 关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式
    Port 22          # SSH 预设使用 22 这个 port,您也可以使用多的 port !
                  # 亦即重复使用 port 这个设定项目即可!
    Protocol 2,1        # 选择的 SSH 协议版本,可以是 1 也可以是 2 ,
                  # 如果要同时支持两者,就必须要使用 2,1 这个分隔了!
    #ListenAddress 0.0.0.0   # 监听的主机适配器!举个例子来说,如果您有两个 IP,
                  # 分别是 192.168.0.100 及 192.168.2.20 ,那么只想要
                  # 开放 192.168.0.100 时,就可以写如同下面的样式:
    ListenAddress 192.168.0.100          # 只监听来自 192.168.0.100 这个 IP 的SSH联机。
                       # 如果不使用设定的话,则默认所有接口均接受 SSH
    PidFile /var/run/sshd.pid      # 可以放置 SSHD 这个 PID 的档案!左列为默认值
    LoginGraceTime 600     # 当使用者连上 SSH server 之后,会出现输入密码的画面,
                  # 在该画面中,在多久时间内没有成功连上 SSH server ,
                  # 就断线!时间为秒!
    Compression yes      # 是否可以使用压缩指令?当然可以啰!
     
    # 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 私钥

    # 2.1 关于 version 1 的一些设定!
    KeyRegenerationInterval 3600     # 由前面联机的说明可以知道, version 1 会使用 
                       # server 的 Public Key ,那么如果这个 Public 
                       # Key 被偷的话,岂不完蛋?所以需要每隔一段时间
                       # 来重新建立一次!这里的时间为秒!
    ServerKeyBits 768           # 没错!这个就是 Server key 的长度!

    # 3. 关于登录文件的讯息数据放置与 daemon 的名称!
    SyslogFacility AUTH         # 当有人使用 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 no     # 是否允许 root 登入!预设是允许的,但是建议设定成 no!
    UserLogin no        # 在 SSH 底下本来就不接受 login 这个程序的登入!
    StrictModes yes      # 当使用者的 host key 改变之后,Server 就不接受联机,
                  # 可以抵挡部分的木马程序!
    #RSAAuthentication yes   # 是否使用纯的 RSA 认证!?仅针对 version 1 !
    PubkeyAuthentication yes  # 是否允许 Public Key ?当然允许啦!只有 version 2
    AuthorizedKeysFile      .ssh/authorized_keys
                  # 上面这个在设定若要使用不需要密码登入的账号时,那么那个
                  # 账号的存放档案所在档名!
    # 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 啦!
    PasswordAuthentication yes # 密码验证当然是需要的!所以这里写 yes 啰!
    PermitEmptyPasswords no  # 若上面那一项如果设定为 yes 的话,这一项就最好设定
                  # 为 no ,这个项目在是否允许以空的密码登入!当然不许!
    ChallengeResponseAuthentication yes  # 挑战任何的密码认证!所以,任何 login.conf 
                       # 规定的认证方式,均可适用!
    #PAMAuthenticationViaKbdInt yes      # 是否启用其他的 PAM 模块!启用这个模块将会
                       # 导致 PasswordAuthentication 设定失效!
     
    # 4.3 与 Kerberos 有关的参数设定!因为我们没有 Kerberos 主机,所以底下不用设定!
    #KerberosAuthentication no
    #KerberosOrLocalPasswd yes
    #KerberosTicketCleanup yes
    #KerberosTgtPassing no
     
    # 4.4 底下是有关在 X-Window 底下使用的相关设定!
    X11Forwarding yes
    #X11DisplayOffset 10
    #X11UseLocalhost yes

    # 4.5 登入后的项目:
    PrintMotd no              # 登入后是否显示出一些信息呢?例如上次登入的时间、地点等
                 # 等,预设是 yes ,但是,如果为了安全,可以考虑改为 no !
    PrintLastLog yes     # 显示上次登入的信息!可以啊!预设也是 yes !
    KeepAlive yes       # 一般而言,如果设定这项目的话,那么 SSH Server 会传送
                 # KeepAlive 的讯息给 Client 端,以确保两者的联机正常!
                 # 在这个情况下,任何一端死掉后, SSH 可以立刻知道!而不会
                 # 有僵尸程序的发生!
    UsePrivilegeSeparation yes # 用户的权限设定项目!就设定为 yes 吧!
    MaxStartups 10      # 同时允许几个尚未登入的联机画面?当我们连上 SSH ,
                 # 但是尚未输入密码时,这个时候就是我们所谓的联机画面啦!
                 # 在这个联机画面中,为了保护主机,所以需要设定最大值,
                 # 预设最多十个联机画面,而已经建立联机的不计算在这十个当中

    # 4.6 关于用户抵挡的设定项目:
    DenyUsers *        # 设定受抵挡的使用者名称,如果是全部的使用者,那就是全部
                 # 挡吧!若是部分使用者,可以将该账号填入!例如下列!
    DenyUsers test
    DenyGroups test      # 与 DenyUsers 相同!仅抵挡几个群组而已!

    # 5. 关于 SFTP 服务的设定项目!
    Subsystem       sftp    /usr/lib/ssh/sftp-server

     
    基本上,在您的系统中,『除非有必要,否则请不要更改 /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 :

    2. 建立的方法真的是简单到不行!直接在 192.168.0.100 这个 Client 上面,以 test2 这个账号,使用 ssh-keygen 这个指令来进行 Key 的产生即可!不过,需要注意的是, version 1 与 version 2 使用的密码演算方式不同,此外, version 2 提供两个密码演算的方法,我们这里仅针对 version 2 的 RSA 这个演算方法进行说明!
      [test2@test2 test2]$ ssh-keygen -t rsa  <==这个步骤在产生 Keys
      Generating public/private rsa key pair.
      Enter file in which to save the key (/home/test2/.ssh/id_rsa):
      Enter passphrase (empty for no passphrase): <==这里按 Enter
      Enter same passphrase again:            <==再按一次 Enter
      Your identification has been saved in /home/test2/.ssh/id_rsa. <==这是私钥
      Your public key has been saved in /home/test2/.ssh/id_rsa.pub.<==这是公钥
      The key fingerprint is:
      c4:ae:d9:02:d1:ba:06:5d:07:e6:92:e6:6a:c8:14:ba test2@test2.linux.org
      注意: -t 指的是『使用何种密码演算方式?』由于我们使用 RSA ,
      所以直接输入 -t rsa 即可建立两支 Keys !
      此外,建立的两把 Keys 都放置在家目录下的 .ssh 这个目录中!
      察看一下这两把 Keys 吧!

      [test2 @test2 test2]$ ll ~/.ssh
      total 12
      -rw-------    1 test2    test2         887 Nov 12 22:36 id_rsa
      -rw-r--r--    1 test2    test2         233 Nov 12 22:36 id_rsa.pub
      -rw-r--r--    1 test2    test2         222 Oct 31 11:20 known_hosts

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

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

    6. 既然我们要让 test2 可以以 test 这个账号登入 test.linux.org 这部主机,那么这部主机自然需要保有 test2 的 public key 啰!对的!所以我们必需要将 Client 端建立的 id_rsa.pub 档案给他拷贝到 test.linux.org 里头的 test 这个用户的家目录之下!那么如果您还记得上面的 sshd_config 这个档案的设定的话,那么应该就记得『AuthorizedKeysFile』这个设定吧!是的!在被登入的主机的某个账号,他的公钥放置的文件名默认就是这个项目所记载的!而他预设的档名就是 authorized_keys 这个文件名啦!那么应该怎么做呢?
      1. 先在 Client 端以 sftp 将公钥丢到 test 上面去!
      [test2@test2 test2]$ cd ~/.ssh             <==切换目录
      [test2@test2 .ssh]$ sftp test@test.linux.org<==连到主机上面
      Connecting to test.linux.org...
      test@test.linux.org's password:                <==输入 test 的密码
      sftp> put id_rsa.pub                        <==将公钥丢到 Server 上面去!
      Uploading id_rsa.pub to /home/test/id_rsa.pub
      sftp> exit

      2. 到 Server 上面,将公钥转存到 authorized_keys 档案中!
      [test@test test]$ cd ~/.ssh
      [test@test .ssh]$ cat ../id_rsa.pub >> authorized_keys

      请注意上面的机器!由于 authorized_keys 可以保存相当多的公钥内容,因此,可以使用 >> 的方式来将 Client 端的公钥新增到该档案内!呵呵!做完这一步一后,未来 test2 就可以直接在 test2.linux.org 以
      [test2@test2 test2]$ ssh test@test.linux.org
      这样就可以不需要输入密码啰!但是请注意, test 不能以 test2 登入 test2.linux.org 喔!
    很简单的步骤吧!这样一来,就可以不需密码的手续了!无论如何,您要记得的是, Server 需要有的是 Public Keys ,而 Client 端的则是 Private Keys !则未来,当您还想要登入其他的主机时,只要将您的 public key ( 就是 id_rsa.pub 这个档案 )给他 copy 到其他主机上面去,并且新增到某账号的 .ssh/authorized_keys 这个档案中!哈哈!成功!
     

    安全设定:
     
    好了,那么关于安全的设定方面,有没有什么值得注意的呢?当然是有啦!我们可以先建议几个项目吧!分别可以由:
    • /etc/ssh/sshd_config
    • /etc/hosts.allow, /etc/hosts.deny
    • iptables
这三方面来着手进行!底下我们就说一说吧!
  • /etc/ssh/sshd_config

  • 一般而言,这个档案的默认项目就已经很完备了!所以,事实上是不太需要更动他的!但是,如果您有些使用者方面的顾虑,那么可以这样修正一些问题呢!
    • 禁止 root 的登入:任何时候,不许 root 以远程联机的方式登入,都会是一个好主意!所以这里蛮建议大家直接将 root 的登入权限拿掉吧!所以,可以修改 /etc/ssh/sshd_config 这个档案的内容为:
    • [root@test root]# vi /etc/ssh/sshd_config
      PermitRootLogin no      <==将他改成 no 啦!
      [root@test root]# /etc/rc.d/init.d/sshd restart
      如此一来,以后 root 就不能以 ssh 登入啰!这样还是比较好的啦! ^_^
       
    • 不许某个群组登入:有些特殊情况中,我们想要让使用者只能使用 sendmail, pop3, ftp 等,但是不希望他可以远程联机进来,那么您可以这样做:

    • 1. 将这些使用者都归纳在某一个特殊群组之下,例如 nossh 这个群组好了;
      2. 在 /etc/ssh/sshd_config 当中加入这一行:『DenyGroups   nossh
      3. 重新启动 sshd : /etc/rc.d/init.d/sshd restart
      这样就OK啦!
       
    • 不许某个使用者登入:跟 DenyGroups 类似,使用 DenyUsers 即可!参考 sshd_config 的设定喔!
  • /etc/hosts.allow 及 /etc/hosts.deny :

  • 这东西也是很简单的啦!直接参考: 简易防火墙架设 一文啰!当然,简单的方法就是:
    [root@test /root]# vi /etc/hosts.allow
    sshd: 192.168.0.1, 192.168.0.2, 192.168.0.3, 192.168.0.4, 192.168.0.5: allow

    [root@test /root]# vi /etc/hosts.deny
    sshd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \ 
    /bin/echo; /usr/sbin/safe_finger @%h ) | \ 
    /bin/mail -s "%d -%h security" root@localhost & \ 
    : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允许登入,您的联机将会被纪录,并且作为以后的参考\n\n ". ) 

     
  • iptables

  • 多几层保护也很好的!所以也可以使用 iptables 喔!参考:简易防火墙架设 一文啰!
基本上, SSH 还蛮安全的,只要取消 root 的登入权限,那么问题应该就会比较小一点啦!所以,虽然可以不用设定 iptables ,但是建议针对几个网域设定一下 /etc/hosts.allow 与 /etc/hosts.deny !加油啰!

大标题的图示参考资源

大标题的图示课后练习
  • Telnet 与 SSH 都是远程联机服务器,为何我们都会推荐使用 SSH 而避免使用 Telnet 呢?原因何在?
  • 请尝试说明 SSH 在 Server 与 Client 端联机时的封包加密机制;
  • 请问 SSH 的配置文件是哪一个?如果我要修改让 root 无法使用 SSH 联机进入我的 SSH 主机,应该如何设定?又,如果要让 badbird 这个用户无法登入 SSH 主机,该如何设定?
  • 在 Linux 上,预设的 Telnet 与 SSH 服务器使用的埠口(port number)各为多少?
  • 如果发现我无法在 Client 端使用 ssh 程序登入我的 Linux 主机,但是 Linux 主机却一切正常,可能的原因为何?(防火墙、known_hosts...)
  • 既然 ssh 是比较安全的资料封包传送方式,那么我就可以在 Internet 上面开放我的 Linux 主机的 SSH 服务了吗?!请说明您选择的答案的原因!

  • 前往参考解答
简易 Telnet SSH 主机设定

2002/11/14:第一次完成
2003/03/08:加入标头说明,与修改部分内容,例如 Telnet 服务器软件的安装等等,以及 SSH 的 putty 使用中文状态!
2003/09/09:将本文进行一些修订,此外,加入了课后练习!
 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室