使用OpenSSH 為運行遠端終端提供安全環境。 OpenSSH 和終端機的基本用法非常簡單,不過,本文還將介紹允許自動登入遠端主機的其他元素、執行遠端應用程式的方法,以及如何在主機之間安全地複製檔案。
關於本系列
典型的UNIX® 管理員擁有一套經常用於輔助管理流程的關鍵實用工具、訣竅和系統。有各種用於簡化不同流程的關鍵實用工具、命令列鍊和腳本。其中一些工具來自於作業系統,而大部分的訣竅則來自長期的經驗累積和減輕系統管理員工作壓力的要求。本系列文章主要專注於最大限度地利用各種UNIX 環境中可用的工具,包括簡化異質環境中的管理任務的方法。
為何使用OpenSSH?
您每天使用的標準網路服務(如FTP、Telnet、RCP 和遠端Shell (rsh) 等)在封閉環境中運作良好,但使用這些服務在網路上傳輸的資訊是未加密的。任何人都可以在您的網路或遠端電腦上使用包嗅探器查看交換的信息,有時甚至可以查看密碼資訊。
而且,使用所有此類服務時,在登入過程中用於自動登入的選項會受到限制,並且通常依賴將純文字密碼嵌入到命令列才能執行語句,從而使登入過程變得更加不安全。
開發的安全Shell (SSH) 協定可以排除這些限制。 SSH 能夠為整個通訊通道提供加密,其中包括登入和密碼憑證交換,它與公鑰和私鑰一起使用可以為登入提供自動化驗證。您也可以將SSH 用作基礎傳輸協定。以這種方式使用SSH 意味著在開啟安全連線後,加密通道可以交換所有類型的信息,甚至HTTP 和SMTP 可以使用該方法來確保通訊機制的安全。
OpenSSH 是SSH 1 和SSH 2 協定的免費實作。它最初是作為OpenBSD (Berkeley Software Distribution) 作業系統的一部分開發的,現在被發佈為UNIX 或Linux® 和類似作業系統的常規解決方案。
安裝OpenSSH
OpenSSH 是免費軟體,可從OpenSSH 的主要網站下載(請參閱參考資料)。可以使用多種系統(包括Linux、HP-UX、AIX®、Solaris、Mac OS X 等)上的原始程式碼來建構OpenSSH 系統。通常可以找到所選平台和版本的預編譯二進位程式碼。有些供應商甚至作為作業系統的一部分提供OpenSSH 工具包。
要建立OpenSSH,您需要以下內容:
如果您需要使用預設配置設置,請使用常規建構序列,如下面的清單1 所示。
$ ./configure $ make $ make install |
這會將二進位檔案、庫檔案和設定檔安裝到/usr/local 目錄中,例如,二進位檔案安裝到/usr/local/bin,設定檔安裝到/usr/local/etc。如果希望將各種工具整合到主環境中,那麼您可能需要指定設定基本目錄的--prefix 選項和設定設定檔位置的--sysconfdir 選項:
$ ./configure --prefix=/usr --sysconfidir=/etc/ssh |
您可能指定的一些其他常規選項包括:
完成配置後,使用make 以正常方式建置。
建置和安裝程序完成後,您需要設定係統,先建立唯一識別系統的SSH 金鑰,然後啟用客戶機和主機之間的安全通訊。您可以運行:
$ make host-key |
或者,您可以在命令列上手動執行各個步驟。您需要建立三個金鑰(每個金鑰對應於一個主要加密演算法:rsa1、rsa 和dsa)。例如,清單2 顯示如何建立rsa1 金鑰。
$ ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key Generating public/private rsa1 key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /etc/ssh//ssh_host_key. Your public key has been saved in /etc/ssh//ssh_host_key.pub. The key fingerprint is: 43:aa:58:3c:d8:30:de:43:af:66:2a:b2:8d:02:08:86 root@remotehost |
系統提示您輸入密碼。對於主機密鑰,您可能不需要密鑰密碼,所以您可以按Return 使用空密碼。或者,您可以在命令列上使用-N 選項加速該過程(請參閱清單3)。
$ ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N "" Generating public/private rsa1 key pair. Your identification has been saved in /etc/ssh/ssh_host_key. Your public key has been saved in /etc/ssh/ssh_host_key.pub. The key fingerprint is: a3:e3:21:4f:b5:9f:ff:05:46:66:bc:36:a1:47:a0:64 root@remotehost |
現在重複這個過程,以建立rsa 和dsa 金鑰(請參閱清單4)。
$ ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" $ ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N "" |
這將為每個金鑰類型建立兩個檔案:公鑰(在以.pub 結尾的檔案中)和私鑰。您應確保私鑰僅由根和SSH 流程讀取—這應自動配置。您可能需要將公鑰複製到網路檔案系統(NFS) 共用中的中央位置,使人們能夠將其新增至已知主機金鑰清單。
最後,您需要啟動sshd 過程,並對其進行配置,以便在啟動時執行。對於Linux 主機,您可以在contrib/redhat/sshd.init 中找到合適的可以新增至/etc/init.d 的init 腳本。
將SSH 用於基本終端訪問
OpenSSH 的主要角色是用作SSH 工具,它是Telnet 協定的安全替代方法,用於安全地遠端登入UNIX 或Linux 主機。
若要使用標準Shell 連線到遠端主機,您只需鍵入主機名稱:
$ ssh remotehost |
在缺省情況下,系統嘗試使用目前使用者名稱作為登入名稱。若要使用不同的登入名稱,請在主機名稱前加上該登入名稱,並使用@ 符號分開。例如:
$ ssh mc@remotehost |
系統提示您輸入使用者密碼-這與Telnet 相似。
當您第一次連接到主機時,系統會詢問您是否需要將遠端主機公鑰的副本儲存在「已知主機」檔案中(請參閱清單5)。
$ ssh root@remotehost The authenticity of host 'remotehost (10.211.55.3)' can't be established. RSA key fingerprint is cc:c8:8b:75:3d:b6:00:2f:a9:9c:53:4c:03:0f:3d:1b. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'remotehost' (RSA) to the list of known hosts. |
以後,您不會收到此警告,但是,當系統偵測到遠端主機傳回的公鑰與該主機檔案中的公鑰不符時就會發出警告,指示可能存在駭客攻擊。這也可能意味著管理員僅重新產生了主機金鑰。
從本質上講,SSH 和Telnet 會話之間沒有什麼不同,只不過SSH 會話進行了加密,任何人幾乎不可能探聽到您的會話內容,也不可能知道您的密碼或您正在執行的命令和操作。
您也可以使用SSH 直接在遠端主機上執行命令,而無需使用Shell。例如,若要在遠端主機上執行who 指令,請參閱清單6。
清單6. 在遠端主機上執行who 指令$ ssh mc@remotehost who admin console Nov 23 14:04 mc ttyp1 Dec 2 10:53 (sulaco.mcslp.pri) mc ttyp2 Dec 10 06:50 (sulaco.mcslp.pri) admin ttyp3 Dec 12 13:33 mc ttyp4 Dec 15 12:38 (nautilus.mcslp.p) |
遠端執行也模擬客戶端主機的標準輸入、輸出和錯誤。這意味著您可以將輸出重新定向到遠端命令。例如,您可以直接將資訊附加到遠端文件,方法是透過管道將輸出從命令傳輸到遠端主機上的SSH(請參閱清單7)。
清單7. 直接將資訊附加到遠端文件$ echo "Hello World" |ssh mc@remotehost 'cat >> helloworlds.txt' |
在使用SSH 簡化登入流程時,您可以使用此方法提高工作效率。
使用SFTP 交換文件
sft 指令是一種與FTP 類似的替代方法,它使用SSH 協定提供的安全通訊通道。
若要開啟SFTP 連接,請在命令列上指定主機名稱:
$ sftp remotehost |
請記住,上面的命令假設您希望使用的登入方式與目前主機相同。若要使用不同的登入方式,請將在主機名稱前加上使用者名稱:
$ sftp mc@remotehost |
儘管SFTP 的工作方式與FTP 類似,但仍存在一些限制和差異。例如,FTP 中的dir 提供了一個長文件清單(請參閱清單8)。
ftp> dir 502 'EPSV': command not understood. 227 Entering Passive Mode (192,168,0,110,150,159) 150 Opening ASCII mode data connection for directory listing. total 1472 drwx------ 3 mc staff 102 Nov 4 11:17 Desktop drwx------ 3 mc staff 102 Nov 4 11:17 Documents drwx------ 18 mc staff 612 Nov 5 18:01 Library drwx------ 3 mc staff 102 Nov 4 11:17 Movies drwx------ 3 mc staff 102 Nov 4 11:17 Music drwx------ 4 mc staff 136 Nov 4 11:17 Pictures drwxr-xr-x 4 mc staff 136 Nov 4 11:17 Public drwxr-xr-x 6 mc staff 204 Nov 4 11:17 Sites drwxrwxrwx 3 root staff 102 Dec 24 07:30 tmp drwxr-xr-x 7 root staff 238 Dec 11 08:39 trial 226 Transfer complete. |
在SFTP 中,dir 的作用相當於主機目錄清單指令的別名,它在UNIX 或Linux 中為ls。在缺省情況下,dir 僅提供一個簡短清單(請參閱清單9)。
sftp> dir Desktop Documents Library Movies Music Pictures Public Sites tmp trial |
要獲得長列表,請使用與ls 相同的選項(請參閱清單10)。
sftp> dir -l drwx------ 3 mc staff 102 Nov 4 11:17 Desktop drwx------ 3 mc staff 102 Nov 4 11:17 Documents drwx------ 18 mc staff 612 Nov 5 18:01 Library drwx------ 3 mc staff 102 Nov 4 11:17 Movies drwx------ 3 mc staff 102 Nov 4 11:17 Music drwx------ 4 mc staff 136 Nov 4 11:17 Pictures drwxr-xr-x 4 mc staff 136 Nov 4 11:17 Public drwxr-xr-x 6 mc staff 204 Nov 4 11:17 Sites drwxrwxrwx 3 root staff 102 Dec 24 07:30 tmp drwxr-xr-x 7 root staff 238 Dec 11 08:39 trial |
其他命令,如更改目錄(cd,本地為lcd)、建立目錄(mkdir)以及發送(put)和接收(get)檔案保持不變。後兩個指令put 和get 都接受通配符(類似FTP 中的mput 和mget),但在SFTP 中傳輸不帶通配符的多個檔案時要小心。例如,sftp> mget file1 file2 file3 被識別為試圖取得file1 和file2,並將它們放置在本機目錄file3 中,但該目錄可能不存在。
使用scp 在主機之間複製文件
scp 指令的工作方式與rc 指令相似,只不過是使用SSH 協定傳輸檔案。在傳輸內容相關檔案或在Internet 上自動交換檔案時,選用scp 要好得多。
其格式類似於rcp;您可以指定之間複製的檔案路徑,必要時應將主機名稱合併到該路徑。例如,要將.bashrc 檔案從遠端主機複製到本機計算機,請使用:
$ scp remotehost:/users/mc/.bashrc ~/.bashrc |
和前面一樣,若指定要使用的用戶名,請在主機前面加上用戶名,並用@ 符號分開:
$ scp mc@remotehost:/users/mc/.bashrc ~/.bashrc |
假設您用於連線的使用者有讀取權限,也需要使用元字元~ 才能存取主目錄中的資訊。
$ scp mc@remotehost:~mc/.bashrc ~/.bashrc |
若要從登入使用者的主目錄中複製,請使用:
$ scp mc@remotehost:.bashrc ~/.bashrc |
scp 指令也支援標準擴充規則。所以,要複製所有的.bash* 文件,您可以使用:
$ scp mc@remotehost:.bash* ~ |
您甚至可以透過使用展開的大括號({}) 更具體地選擇單一檔案:
$ scp mc@remotehost:".bash{rc,_path,_aliases,_vars}" ~ |
請注意,檔案路徑中展開的大括號(不是完整的遠端路徑表達式)已用雙引號括上。
在上面所有的範例中,系統都會提示您輸入遠端主機的密碼。透過為主機提供您自己的個人密鑰的公共部分可以避免這種情況。
使用公用金鑰啟用自動登入
當您使用ssh、sftp 或scp 登入遠端系統後,您仍需要使用密碼才能完成登入程序。透過建立公鑰或私鑰,將金鑰的公共部分附加到~/.ssh/authorized_keys 文件,並與遠端網站交換了有效金鑰後,您可以省去提供密碼的要求並允許自動登入。
要建立公鑰或私鑰,您需要使用ssh-keygen 來指定金鑰加密的類型。在示範中使用了rsa 金鑰類型,但是其他金鑰類型也有效。若要建立密鑰,請參閱清單11。
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): |
您應輸入保存密鑰(公有和私有組件)的檔案的位置。使用預設值(在主目錄中的.ssh 目錄中)一般就可以了(請參閱清單12)。
Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): |
如果您在此階段輸入了密碼,則會建立安全金鑰文件,但是每次使用金鑰時,也必須輸入密碼。按Return 意味著不需要任何密碼(請參閱清單13)。
清單13. 透過按Return 鍵跳過密碼需求Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 98:da:8d:48:a8:09:44:b1:b3:62:51:2d:a9:6b:61:ba root@remotehost |
現在已建立了公鑰(id_rsa.pub) 和對應的私鑰(id_rsa)。
若要啟用自動登錄,您必須將公鑰的內容複製到遠端主機上~/.ssh 目錄中的authorized_keys 檔案中。您可以使用SSH 自動完成此操作(請參閱清單14)。
$ cat ./.ssh/id_rsa.pub | ssh mc@remotehost 'cat >> .ssh/authorized_keys'; |
還有,如果在多個主機中經常執行此操作,則可以使用小腳本或Shell 函數來執行所有必要步驟,如清單15 所示。
OLDDIR='pwd'; if [ -z "$1" ]; then echo Need user@host info; exit; fi; cd $HOME; if [ -e "./.ssh/id_rsa.pub" ]; then cat ./.ssh/id_rsa.pub | ssh $1 'cat >> .ssh/authorized_keys'; else ssh-keygen -t rsa; cat ./.ssh/id_rsa.pub | ssh $1 'cat >> .ssh/authorized_keys'; fi; cd $OLDDIR |
您可以使用setremotekey 腳本複製現有金鑰,如果金鑰不存在,可在複製之前建立一個:
$ setremotekey mc@remotehost |
現在,每當需要使用公鑰登入遠端主機時,您可以結合使用個人金鑰腳本和遠端主機上該使用者接受的金鑰清單。
總結
OpenSSH 是一個重要工具,它可以保護電腦之間的通訊和資訊傳輸的安全。它不僅是常規工具(如Telnet、FTP 和RCP)的安全替代方法,還可以充當其他服務(如Subversion、X Windows System 和rsync)的傳輸協定。本文向您介紹了啟動和運行OpenSSH 所需的基本步驟,如何最有效地使用OpenSSH 提供的主要工具,以及如何使用金鑰交換工具來簡化登入和連接性問題。