SSHHowto
原文出处:https://wiki.ubuntu.com/SSHHowTo
原文作者:UbuntuWiki
翻译人员:denven
校对人员:Bentusi
贡献者:
适用版本:
文章状态:等待翻译
SSH(安全Shell)简介
OpenSSH 能提供安全的远程访问,支持命令行会话,X11转发(X forwarding),SCP 和安全 FTP 文件传输。同时,也可利用端口转发(port forwarding)为其它协议建立加密通道。
SSH 可以取代传统的telnet,rlogin,FTP。因为这些协议中密码以明文的方式传递,这意味着密码很容易被截取,而 SSH 通过加密措施解决了这些问题,提供安全的远程访问方案。它支持命令行会话,X11转发(X forwarding),SCP 和安全 FTP 文件传输。同时,也可利用端口转发(port forwarding)为其它协议建立加密通道。
安装SSH服务器端
如果希望安全地连接到远程主机(在Windows下用Putty来登录),需要为其安装一个ssh服务端。Ubuntu 采用 openssh-server 做服务端,需要的安装包是 openssh-server。
通过SSH进行远程文件传输
Linux下图形界面操作
用Nautilus即可 SSH 登录远程主机进行浏览和传输文件。 依次点击 “位置(Places)” -> “连接到服务器(Connect to Server)”,“服务类型(Service Type)”选择 “SSH”,在“服务器(Server)”栏中填写好远程主机的名称和IP地址,“用户名(User Name)”处填写登录名,你也可以为自己的登录帐户设置一个昵称。
登录后,可以在不同端的窗口间通过拖放操作来复制文件。
Windows下图形界面操作
用WinSCP在Windows下登录Linux的SSH服务器进行文件传输,该软件可以在[1]免费下载。
使用命令行操作
使用 scp 命令在本地和远程主机间安全复制文件,如下:
scp <file> <username>@<IP address or hostname>:<DestinationDirectory>
例如,要从本地主机复制一个文件到远程主机,运行:
scp file.txt [email protected]:/home/joe
又如:
scp "New Document.odw" joe@laptop:"/home/joe/Summer 2005"
使用该命令,必须包含本地文件名、远程主机名、远程主机 IP 地址(或域名)、要复制到的远程目录三个部分。
从远程主机复制文件到本地主机,运行:
scp [email protected]:/home/hornbeck/otherfile.txt .
'.'表示将文件复制到当前目录,也可以用其他的文件名,如'my.txt'将复制过来的文件重命名。
scp 命令两个最常用的参数是 '-r' 和 '-C',其中 '-r' 表示递归复制整个目录树, '-C'表示压缩,可在加快文件传送速度,此选项在 ssh 和 sftp 命令中同样有效。
注意:不能在两台远程主机间复制文件,要么从本地复制文件,要么将文件复制到本地。
在 scp 命令中,如果本地和远程主机为同一台主机,那么只需主机名(@xxx可省略)即可,如果远程主机目录被省略,那么表示在用户主目录下进行操作。例如:
scp 192.168.1.103:file.txt .
通过ssh登录远程主机
用 ssh 命令远程登录:
ssh <username>@<computer name or ipaddress>
又如:
ssh joe@laptop
如:
ssh [email protected]
公钥验证
以前大家都使用传统的“用户名/密码”的验证方式。采用这种方式,一旦别人猜测或者嗅探到你的密码,安全性就无法保障。一直以来 SSH 提供公共密钥验证方式,即使用私钥和公钥密钥对来代替简单的密码。
如果没有私钥,请先创建一个,输入:
ssh-keygen -t dsa
然后,系统将依次询问将私钥保存到何处(保存到默认位置即可)、选择密码短语(密码短语是用来加密私钥的)。任何人只要获取到(没被保护的)私钥,他就具有访问其他机器的权限,因此建议设置密码时仔细考虑、选择一个好的密码。如果你不甚了解如何选择密码,可以参考ChoosingSecurePassword(如何选择一个安全的密码)。
到此为止,要想访问其他的机器只依赖于你的公钥。公钥在私钥创建时同时被创建,通常它位于目录:
~/.ssh/id_dsa.pub
在目标主机的密钥验证文件中需要用到这个密钥(一行ASCII的字符串),这个文件位于目标主机该目录:
~/.ssh/authorized_keys
所以需要将这行字符串拷贝到密钥验证文件中,或者使用命令"ssh-copy-id"进行处理:
ssh-copy-id root@fileserver01
使用该命令需要输入root密码,如果你不知道root密码,那么尝试用其他中间途径拷贝该密钥到目的主机。在公钥添加之后,那么就可以被验证通过了。
attachment:IconsPage/IconNote.png 在使用ssh-copy-id
命令之前,需要用ssh-add
(下文中有描述)命令将密码短语保存到 ssh-agent。保存后用 ssh 命令登录远程目的主机:
Run::运行:
ssh root@fileserver01
这时将不会再要求输入密码,但是会要求输入密码短语。请注意,“密码”与“密码短语”是两个不同的概念。用户密码保存在目标机器的 /etc/passwd 文件中,而“密码短语”则是用来解密本机的私钥的。
在这重申一下,公钥验证的实际安全性要高于密码验证机制是因为需要两步验证:
- 已加密的私钥
- 用来解密私钥的密码短语
所以如果你选择无密码(在下一节中提到)的方式,比起单独使用一个密码的方式,更无安全性可言。
attachment:IconsPage/IconNote.png 在Ubuntu中已经启用基于密码的验证方式,如果你想禁用远程用户使用密码进行登录,可以手动设置:在 /etc/ssh/sshd_config 文件中设置"Password``Authentication no",然后重启 ssh 服务(sudo /etc/init.d/ssh restart)。
限制SSH登录
使用 SSH 公钥验证还有另一个方便之处,那就是目标服务器可以限制访问者所使用的命令。例如你仅需通过SSH来维护一个 CVS 仓库,可以在密钥验证文件中加入下述行: command="/usr/bin/cvs server" ssh-dss AAAAB3N....
这样只允许用户运行该命令。
通过批处理脚本自动匹配登录
在公钥验证(见上文)中也可以对需要输入密码的任务进行自动匹配。如果你想每天午夜时刻从远程主机拷贝一个文件,那么需要在两台机器之间建立一种信任关系。来看如何实现,首先在一台机器上为该服务创建一账号,再(用 ssh-keygen -t dsa命令)创建密钥对,此时如果询问是否建立密码短语,按回车键不创建(这样私钥将不会受到保护),然后(用ssh-copy-id命令)将公钥添加到另一台机器的authorized_keys2文件,这样用 ssh 登录到另一台机器将不会要求输入密码短语,最后在crontab中添加SSH调用即可。
attachment:IconsPage/IconWarning3.png 注意!对私钥不加保护可能会留下安全隐患,黑客们只需获取私钥然后就可以访问目标机器了。
使用ssh-agent
如果需要经常通过SSH登录其他机器进行文件复制(这对管理员来说很平常),有没有简化掉密码短语输入这一步的途径呢?当然有!用SSH agent!ssh agent的"ssh-add"可以让你一劳永逸,因为启用后SSH agent会调用一个专门的子进程来记住密码短语的输入。
其原理是什么呢?这个不是我们需要关心的,你只要知道 X 会话在ssh-agent中会自动建立。在登录输入密码时启用"ssh-add"即可,下次使用 *SSH*时将不会有要求输入密码短语这一步,是不是很方便呢?:)
attachment:IconsPage/IconNote.png 重要:如果需要暂时离开自己的机器,建议最好锁住荧屏,以防离开期间他人用你的机器登录到远程主机(因为他们也不需要输入密码短语来验证)。
如果启用了"ssh-add",仍希望以后登录时要求提示有密码短语输入,需要进行如下设置:
- Click on *System* 点击*System(系统)*
- Choose *Preferences* 选择*Preferences(选项)*
- Choose *Sessions* 选择*Sessions(会话)*
- Select the *Startup Programs* tab 选择*Startup Programs(启动程序)*选项卡
- Click on *Add* 点击*Add(添加)*
- Enter "ssh-add" as a command 输入命令"ssh-add"
这样,下次登录时就会有要求用户输入密码短语这一步了。
安全性
用户日志和其他一些信息保存在 /var/log/auth.log (或auth.log.0等)文件中,通过检查日志文件来查看是否有其他用户尝试登录自己的系统,运行命令:
awk '/Invalid user/ {print $8}' /var/log/auth.log{,.0} | sort | uniq -c
该命令通过排列用户登陆次数来显示某些使用非法用户名尝试登录(或许是自动登录攻击)的痕迹。
用 last 命令查看日志中用户及其最后登录信息 ,用 lastb 命令可以快速查看。
配置更具安全性的SSH服务器,参考下文Advanced Configuration(高级配置)。
高级配置
高级配置和其他安全性方面请参考AdvancedOpenSSH。
关于GPG和OpenSSH
如何使用 GPG 部署 SSH 密钥请参考GPGsigningforSSHHowTo 。