跳过导航链接 | |
退出打印视图 | |
系统管理指南:安全性服务 Oracle Solaris 10 8/11 Information Library (简体中文) |
19. 使用 Oracle Solaris 安全 Shell(任务)
Oracle Solaris 安全 Shell 和 OpenSSH 项目
配置 Oracle Solaris 安全 Shell(任务列表)
配置 Oracle Solaris 安全 Shell(任务)
使用 Oracle Solaris 安全 Shell(任务列表)
安全 Shell 可提供本地 shell 与远程 shell 之间的安全访问。有关更多信息,请参见 ssh_config(4) 和 ssh(1) 手册页。
如果用户的站点要实现基于主机的验证或用户公钥验证,则必须生成公钥/私钥对。有关其他选项,请参见 ssh-keygen(1) 手册页。
开始之前
通过系统管理员确认是否配置了基于主机的验证。
myLocalHost% ssh-keygen -t rsa Generating public/private rsa key pair. …
其中,-t 是算法类型,可以是 rsa、dsa 或 rsa1 之一。
缺省情况下,文件名 id_rsa(表示 RSA v2 密钥)显示在括号中。可通过按回车键选择此文件。或者,可以键入替换的文件名。
Enter file in which to save the key (/home/jdoe/.ssh/id_rsa):<Press Return>
通过将字符串 .pub 附加到私钥文件的名称后,可以自动创建公钥的文件名。
此口令短语用于加密私钥。强烈建议不要使用空项。请注意,键入口令短语时,它们不会显示。
Enter passphrase (empty for no passphrase): <Type passphrase>
Enter same passphrase again: <Type passphrase> Your identification has been saved in /home/jdoe/.ssh/id_rsa. Your public key has been saved in /home/jdoe/.ssh/id_rsa.pub. The key fingerprint is: 0e:fb:3d:57:71:73:bf:58:b8:eb:f3:a3:aa:df:e0:d1 jdoe@myLocalHost
检查密钥文件的路径是否正确。
% ls ~/.ssh id_rsa id_rsa.pub
此时,已创建公钥/私钥对。
现在即可登录到远程主机。有关详细信息,请参见如何使用安全 Shell 登录到远程主机。
% cat /etc/ssh/ssh_host_dsa_key.pub | ssh RemoteHost \ 'cat >> ~./ssh/known_hosts && echo "Host key copied"'
Enter password: <Type password> Host key copied %
在一行中键入以下命令(不带反斜杠)。
myLocalHost% cat $HOME/.ssh/id_rsa.pub | ssh myRemoteHost \ 'cat >> .ssh/authorized_keys && echo "Key copied"'
复制该文件后,将显示 "Key copied"(密钥已复制)消息。
Enter password: Type login password Key copied myLocalHost%
有关过程,请参见如何减少安全 Shell 中的口令提示。有关更多信息,请参见 ssh-agent(1) 和 ssh-add(1)手册页。
示例 19-2 为用户建立 v1 RSA 密钥
在以下示例中,用户可以访问运行安全 Shell 协议版本 1 的主机。要通过 v1 主机进行验证,用户应创建一个 v1 密钥,然后将公钥部分复制到远程主机。
myLocalHost% ssh-keygen -t rsa1 -f /home/jdoe/.ssh/identity Generating public/private rsa key pair. … Enter passphrase (empty for no passphrase): <Type passphrase> Enter same passphrase again: <Type passphrase> Your identification has been saved in /home/jdoe/.ssh/identity. Your public key has been saved in /home/jdoe/.ssh/identity.pub. The key fingerprint is: … myLocalHost% ls ~/.ssh id_rsa id_rsa.pub identity identity.pub myLocalHost% cat $HOME/.ssh/identity.pub | ssh myRemoteHost \ 'cat >> .ssh/authorized_keys && echo "Key copied"'
以下过程不会更改私钥。此过程将更改私钥的验证机制,即口令短语。有关更多信息,请参见 ssh-keygen(1) 手册页。
键入带 -p 选项的 ssh-keygen 命令,并回答提示。
myLocalHost% ssh-keygen -p Enter file which contains the private key (/home/jdoe/.ssh/id_rsa):<Press Return> Enter passphrase (empty for no passphrase): <Type passphrase> Enter same passphrase again: <Type passphrase>
其中,-p 用于请求更改私钥文件的口令短语。
键入 ssh 命令,并指定远程主机名称。
myLocalHost% ssh myRemoteHost
此时会出现提示,询问远程主机的真实性:
The authenticity of host 'myRemoteHost' can't be established. RSA key fingerprint in md5 is: 04:9f:bd:fc:3d:3e:d2:e7:49:fd:6e:18:4f:9c:26 Are you sure you want to continue connecting(yes/no)?
初始连接到远程主机时,出现此提示为正常情况。
Are you sure you want to continue connecting(yes/no)? no
管理员负责更新全局 /etc/ssh/ssh_known_hosts 文件。更新后的 ssh_known_hosts 文件可禁止出现此提示。
Are you sure you want to continue connecting(yes/no)? yes
Enter passphrase for key '/home/jdoe/.ssh/id_rsa': <Type passphrase>
jdoe@myRemoteHost's password: <Type password> Last login: Fri Jul 20 14:24:10 2001 from myLocalHost myRemoteHost%
所发送的命令将会加密。所接收的任何响应都会加密。
完成后,键入 exit 或者使用常规方法退出 shell。
myRemoteHost% exit myRemoteHost% logout Connection to myRemoteHost closed myLocalHost%
如果不想键入口令短语和口令来使用安全 Shell,则可以使用代理守护进程。请在会话开始时启动守护进程。然后,使用 ssh-add 命令将私钥存储到代理守护进程中。如果您在不同的主机上拥有不同的帐户,请添加需要用于会话的密钥。
可以根据需要手动启动代理守护进程,如以下过程所述:或者,可以将代理守护进程设置为在每个会话开始时自动运行,如如何将 ssh-agent 命令设置为在 CDE 中自动运行中所述。
myLocalHost% eval `ssh-agent` Agent pid 9892
myLocalHost% pgrep ssh-agent 9892
键入 ssh-add 命令。
myLocalHost% ssh-add Enter passphrase for /home/jdoe/.ssh/id_rsa: <Type passphrase> Identity added: /home/jdoe/.ssh/id_rsa(/home/jdoe/.ssh/id_rsa) myLocalHost%
myLocalHost% ssh myRemoteHost
系统不会提示您输入口令短语。
示例 19-3 使用 ssh-add 选项
在本示例中,jdoe 将向代理守护进程添加两个密钥。-l 选项用于列出该守护进程中存储的所有密钥。在会话结束时,使用 -D 选项删除代理守护进程中的所有密钥。
myLocalHost% ssh-agent myLocalHost% ssh-add Enter passphrase for /home/jdoe/.ssh/id_rsa: <Type passphrase> Identity added: /home/jdoe/.ssh/id_rsa(/home/jdoe/.ssh/id_rsa) myLocalHost% ssh-add /home/jdoe/.ssh/id_dsa Enter passphrase for /home/jdoe/.ssh/id_dsa: <Type passphrase> Identity added: /home/jdoe/.ssh/id_dsa(/home/jdoe/.ssh/id_dsa) myLocalHost% ssh-add -l md5 1024 0e:fb:3d:53:71:77:bf:57:b8:eb:f7:a7:aa:df:e0:d1 /home/jdoe/.ssh/id_rsa(RSA) md5 1024 c1:d3:21:5e:40:60:c5:73:d8:87:09:3a:fa:5f:32:53 /home/jdoe/.ssh/id_dsa(DSA) User conducts Oracle Solaris Secure Shell transactions
myLocalHost% ssh-add -D Identity removed: /home/jdoe/.ssh/id_rsa(/home/jdoe/.ssh/id_rsa.pub) /home/jdoe/.ssh/id_dsa(DSA)
如果您使用 CDE,可以通过自动启动代理守护进程 ssh-agent,避免在每次使用安全 Shell 时都提供口令短语和口令。可以通过 .dtprofile 脚本启动代理守护进程。要将口令短语和口令添加到代理守护进程,请参见示例 19-3。
注意 - 如果您使用 Sun Java Desktop System (Java DS),请勿将 ssh-agent 命令设置为自动运行。因为 ssh-agent 进程的中止由 CDE 接口控制,所以当您退出 Java DS 时,该守护进程仍会继续运行。例如,如果您在 CDE 会话中启动了守护进程,之后转到了 Java DS 会话,然后注销,则该守护进程仍会继续运行。 正在运行的守护进程会占用系统资源。虽然未发现 ssh-agent 守护进程继续保持运行会引发相关问题,但是由于该守护进程包含口令,因此可能会造成安全风险。 |
将以下行添加到 $HOME/.dtprofile 脚本的末尾:
if [ "$SSH_AUTH_SOCK" = "" -a -x /usr/bin/ssh-agent ]; then eval `/usr/bin/ssh-agent` fi
将以下行添加到 $HOME/.dt/sessions/sessionexit 脚本中:
if [ "$SSH_AGENT_PID" != "" -a -x /usr/bin/ssh-agent ]; then /usr/bin/ssh-agent -k fi
此项可确保终止 CDE 会话后,任何用户都无法使用安全 Shell 代理。由于脚本使用特定于 CDE 的接口 sessionexit ,因此该过程不会在 Sun Java Desktop System 会话中终止代理守护进程。
可以指定将本地端口转发到远程主机。实际上,分配了一个套接字用于侦听本地端的端口。从此端口到远程主机的连接通过安全通道实现。例如,可以指定端口 143 以通过 IMAP4 远程获取电子邮件。同样,也可以在远程端指定端口。
开始之前
使用端口转发之前,管理员必须先在远程安全 Shell 服务器上启用端口转发。有关详细信息,请参见如何在安全 Shell 中配置端口转发。
指定用于侦听远程通信的本地端口。此外,指定用于转发通信的远程主机和远程端口。
myLocalHost% ssh -L localPort:remoteHost:remotePort
指定用于侦听远程通信的远程端口。此外,指定用于转发通信的本地主机和本地端口。
myLocalHost% ssh -R remotePort:localhost:localPort
示例 19-4 使用本地端口转发接收邮件
以下示例说明如何使用本地端口转发来安全地接收来自远程服务器的邮件。
myLocalHost% ssh -L 9143:myRemoteHost:143 myRemoteHost
此命令可将连接从 myLocalHost 上端口 9143 转发到端口 143。端口 143 是 myRemoteHost 上的 IMAP v2 服务器端口。用户启动邮件应用程序时,需要指定本地端口号,如以下对话框所示。
请勿将此对话框中的 localhost 与 myLocalHost 相混淆。myLocalHost 是假设的主机名,而 localhost 则是用于标识本地系统的关键字。
示例 19-5 使用远程端口转发在防火墙外部进行通信
本示例说明企业环境中的用户如何将连接从外部网络中的主机转发到公司防火墙内的主机。
myLocalHost% ssh -R 9022:myLocalHost:22 myOutsideHost
此命令将连接从 myOutsideHost 上的端口 9022 转发到本地主机上的端口 22(sshd 服务器)。
myOutsideHost% ssh -p 9022 localhost myLocalHost%
以下过程说明如何使用 scp 命令在主机之间复制加密的文件。您可以在一台本地主机和一台远程主机之间,或者两台远程主机之间复制加密的文件。此命令的运行与 rcp 命令类似,区别在于 scp 命令会提示进行验证。有关更多信息,请参见 scp(1) 手册页。
也可以使用 sftp,即 ftp 命令的一种更安全的形式。有关更多信息,请参见 sftp(1) 手册页。有关示例,请参见示例 19-6。
指定源文件、远程目标上的用户名和目标目录。
myLocalHost% scp myfile.1 jdoe@myRemoteHost:~
Enter passphrase for key '/home/jdoe/.ssh/id_rsa': <Type passphrase> myfile.1 25% |******* | 640 KB 0:20 ETA myfile.1
键入口令短语后,将会显示进度指示器。请参见上述输出中的第二行。进度指示器显示以下内容:
文件名
已传输的文件百分比
表示已传输文件百分比的一系列星号
已传输的数据量
完整文件的估计到达时间 (estimated time of arrival, ETA)(即剩余的时间量)
示例 19-6 使用 sftp 命令时指定一个端口
在本示例中,用户希望 sftp 命令使用特定端口。用户使用 -o 选项来指定端口。
% sftp -o port=2222 guest@RemoteFileServer
可以使用安全 Shell 建立从防火墙内的主机到防火墙外的主机的连接。通过在配置文件中指定 ssh 的代理命令或者在命令行中将该代理命令指定为选项,可以完成此任务。有关命令行选项,请参见示例 19-7。
通常,可以通过配置文件定制 ssh 交互。
可以在 ~/.ssh/config 中定制独立的个人文件。
或者,可以使用管理配置文件 /etc/ssh/ssh_config 中的设置。
可以使用两种类型的代理命令定制这些文件。一个是用于 HTTP 连接的代理命令。另一个是用于 SOCKS5 连接的代理命令。有关更多信息,请参见 ssh_config(4) 手册页。
使用以下语法添加所需数量的行:
[Host outside-host] ProxyCommand proxy-command [-h proxy-server] \ [-p proxy-port] outside-host|%h outside-port|%p
在命令行中指定远程主机名时,将代理命令规范限制为实例。如果对 outside-host 使用通配符,则可将代理命令规范应用于一组主机。
指定代理命令。
该命令可以是以下之一:
/usr/lib/ssh/ssh-http-proxy-connect,用于 HTTP 连接
/usr/lib/ssh/ssh-socks5-proxy-connect,用于 SOCKS5 连接
这些选项分别指定代理服务器和代理端口。如果存在,则代理将覆盖指定代理服务器和代理端口的任何环境变量,如 HTTPPROXY、HTTPPROXYPORT、SOCKS5_PORT、SOCKS5_SERVER 和 http_proxy。http_proxy 变量指定 URL。如果不使用这些选项,则必须设置相关的环境变量。有关更多信息,请参见 ssh-socks5-proxy-connect(1) 和 ssh-http-proxy-connect(1) 手册页。
指定要连接到的特定主机。请在命令行中使用 %h 替换参数来指定主机。
指定要连接的特定端口。请在命令行中使用 %p 替换参数来指定端口。通过指定 %h 和 %p 而不使用 Host outside-host 选项,只要调用 ssh 命令即可将代理命令应用到主机参数。
例如,键入以下命令:
myLocalHost% ssh myOutsideHost
该命令可在个人配置文件中查找 myOutsideHost 的代理命令规范。如果找不到规范,则该命令将在系统范围的配置文件 /etc/ssh/ssh_config 中查找。该代理命令将替代 ssh 命令。
示例 19-7 通过命令行连接到防火墙外部的主机
如何设置到防火墙外部主机的缺省连接说明了如何在配置文件中指定代理命令。在本示例中,在 ssh 命令行中指定代理命令。
% ssh -o'Proxycommand=/usr/lib/ssh/ssh-http-proxy-connect \ -h myProxyServer -p 8080 myOutsideHost 22' myOutsideHost
ssh 命令的 -o 选项提供了指定代理命令的命令行方法。此示例命令可执行以下操作:
使用 HTTP 代理命令替代 ssh
使用端口 8080 并将 myProxyServer 用作代理服务器
连接到 myOutsideHost 上的端口 22