歡迎您光臨本站 註冊首頁

Linux系統中OpenSSH的安裝和配置

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  概述
許多網路程序,如telnet、rsh、rlogin或rexec,用明文(plain text)傳送口令和秘密的信息,所以就可利用任何連接到網路上的計算機監聽這些程序和伺服器之間的通信並獲取口令和秘密信息。現在,telnet程序對於日常的管理工作是必不可少的,但是它又是不安全的,那麼用什麼來替代它呢?OpenSSH就是那些過時的、不安全的遠程登錄程序,如:telnet、rlogin、rsh、rdist或rcp的替代品。

在OpenSSH的README文件中提到:ssh(Secure Shell)程序可以通過網路登錄到遠程主機並執行命令。它提供了很強的安全驗證可以在不安全的網路中進行安全的通信。

我們把OpenSSH配置成支持TCP-Wrappers(inetd超級伺服器),這樣能夠進一步地提高安全性而且也沒有必要把OpenSSH作為守護進程(daemon)在後台運行。當客戶端的程序提出連接請求的時候,TCP-Wrappers守護進程就會在把連接重定向到OpenSSH之前,對連接請求進行驗證和授權。OpenSSH是自由軟體而且使用不受專利保護的加密演算法。因此,我建議你使用OpenSSH(免費而且修正了一些bug),而不使用SSH1(免費但是有bug)和SSH2(現在使用商用的許可協議)。

注意事項
下面所有的命令都是Unix兼容的命令。

源路徑都為「/var/tmp」(當然在實際情況中也可以用其它路徑)。

安裝在RedHat Linux 6.1和6.2下測試通過。

要用「root」用戶進行安裝。

OpenSSH的版本是1.2.3。

軟體包的來源
OpenSSH的主頁:http://violet.ibs.com.au/openssh/。

下載:openssh-1.2.3.tar.gz。

準備工作
編譯OpenSSH需要zlib-devel軟體包,這個軟體包包括頭文件和函數庫。編譯使用zlib的壓縮和解壓函數的程序,就要事先安裝這個軟體包。可以用RedHat 6.1或6.2的光碟安裝。

l 用下面的命令驗證一下在系統中是否已經安裝了zlib-devel軟體包:

[root@deep /]# rpm -qi zlib-devel

l 用下面命令在系統中安裝zlib-devel軟體包:

[root@deep /]# mount /dev/cdrom /mnt/cdrom/
[root@deep /]# cd /mnt/cdrom/RedHat/RPMS/
[root@deep RPMS]# rpm -Uvh zlib-devel-version.i386.rpm
gd ##################################################
[root@deep RPMS]# rpm -Uvh gd-devel-version.i386.rpm
zlib-devel ##################################################
[root@deep RPMS]# cd /; umount /mnt/cdrom/

在使用OpenSSH之前,還必須安裝OpenSSL。因為就算你不使用OpenSSL創建或保存加密文件,OpenSSH需要用OpenSSL的庫文件才能正常運行。

安裝軟體包需要注意的問題
最好在編譯前和編譯后都做一張系統中所有文件的列表,然後用「diff」命令去比較它們,找出其中的差別並知道到底把軟體安裝在哪裡。只要簡單地在編譯之前運行一下命令「find /* >OpenSSH1」,在編譯和安裝完軟體之後運行命令「find /* > OpenSSH2」,最後用命令「diff OpenSSH1 OpenSSH2 > OpenSSH-Installed」找出變化。

編譯和安裝
把軟體包(tar.gz)解壓:

[root@deep /]# cp openssh-version.tar.gz /var/tmp
[root@deep /]# cd /var/tmp
[root@deep tmp]# tar xzpf openssh-version.tar.gz

編譯和優化
第一步

轉到OpenSSH的新目錄下,先設置編譯器的編譯參數:

CC="egcs" \
CFLAGS="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-
pointer -fno-exceptions" \
./configure \
--prefix=/usr \
--sysconfdir=/etc/ssh \
--with-tcp-wrappers \
--with-ipv4-default \
--with-ssl-dir=/usr/include/openssl

這些設置告訴編譯器如何編譯OpenSSH:

l 鏈接上libwrap函數庫並且加上對TCP Wrappers的支持

l 禁止Linux/glibc-2.1.2中域名解析的延時,縮短建立連接的時間

l 設置OpenSSL函數庫的路徑,這樣OpenSSH才能正常運行

第二步

現在,編譯和安裝OpenSSH:

[root@deep openssh-1.2.3]# make
[root@deep openssh-1.2.3]# make install
[root@deep openssh-1.2.3]# make host-key
[root@deep openssh-1.2.3]# install -m644 contrib/redhat/sshd.pam /etc/pam.d/sshd

「make」命令把源文件編譯成可執行的二進位文件,「make install」把二進位文件和配置文件安裝在合適的目錄下。「make host-key」生成主機密匙,「install」命令在RedHat Linux上安裝對OpenSSH的PAM支持。

清除不必要的文件
用下面的命令刪除不必要的文件:

[root@deep /]# cd /var/tmp
[root@deep tmp]# rm -rf openssh-version/ openssh-version.tar.gz

「rm」命令刪除所有編譯和安裝OpenSSH所需要的源程序,並且把OpenSSH軟體的壓縮包刪除掉。

配置
可以到這去下載「floppy.tgz」文件:http://www.openna.com/books/floppy.tgz。把「floppy.tgz」文件解開之後,可以在相應的目錄下發現我們在這本書中介紹的所有軟體的配置文件。這樣就沒有必要手工重新生成這些文件,或者用拷貝粘貼的方法把它們粘貼到配置文件中去。不管是打算自己動手生成配置文件還是拷貝現成的,你都要學會自己修改配置文件並且把配置文件拷貝到正確的目錄下。下面將具體說明。

為了運行OpenSSH,必須創建或者把下面的文件拷貝到相應的目錄下:

l 把「sshd_config」文件拷貝到「/etc/ssh」目錄下

l 把「ssh_config」文件拷貝到「/etc/ssh」目錄下

l 把「ssh」文件拷貝到「/etc/pam.d/」目錄下

可以把「floppy.tgz」解壓之後,找到上面列出來的文件,並拷貝到合適的目錄下,或者用拷貝粘貼的方法從本書中直接粘貼出。

配置「/etc/ssh/ssh_config」文件
「/etc/ssh/ssh_config」文件是OpenSSH系統範圍的配置文件,允許你通過設置不同的選項來改變客戶端程序的運行方式。這個文件的每一行包含「關鍵詞-值」的匹配,其中「關鍵詞」是忽略大小寫的。下面列出來的是最重要的關鍵詞,用man命令查看幫助頁(ssh (1))可以得到詳細的列表。

編輯「ssh_config」文件(vi /etc/ssh/ssh_config),添加或改變下面的參數:

# Site-wide defaults for various options
Host *
ForwardAgent no
ForwardX11 no
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication yes
FallBackToRsh no
UseRsh no
BatchMode no
CheckHostIP yes
StrictHostKeyChecking no
IdentityFile ~/.ssh/identity
Port 22
Cipher blowfish
EscapeChar ~

下面逐行說明上面的選項設置:

Host *
選項「Host」只對能夠匹配後面字串的計算機有效。「*」表示所有的計算機。

ForwardAgent no
「ForwardAgent」設置連接是否經過驗證代理(如果存在)轉發給遠程計算機。

ForwardX11 no
「ForwardX11」設置X11連接是否被自動重定向到安全的通道和顯示集(DISPLAY set)。

RhostsAuthentication no
「RhostsAuthentication」設置是否使用基於rhosts的安全驗證。

RhostsRSAAuthentication no
「RhostsRSAAuthentication」設置是否使用用RSA演算法的基於rhosts的安全驗證。

RSAAuthentication yes
「RSAAuthentication」設置是否使用RSA演算法進行安全驗證。

PasswordAuthentication yes
「PasswordAuthentication」設置是否使用口令驗證。

FallBackToRsh no
「FallBackToRsh」設置如果用ssh連接出現錯誤是否自動使用rsh。

UseRsh no
「UseRsh」設置是否在這台計算機上使用「rlogin/rsh」。

BatchMode no
「BatchMode」如果設為「yes」,passphrase/password(互動式輸入口令)的提示將被禁止。當不能互動式輸入口令的時候,這個選項對腳本文件和批處理任務十分有用。

CheckHostIP yes
「CheckHostIP」設置ssh是否查看連接到伺服器的主機的IP地址以防止DNS欺騙。建議設置為「yes」。

StrictHostKeyChecking no
「StrictHostKeyChecking」如果設置成「yes」,ssh就不會自動把計算機的密匙加入「$HOME/.ssh/known_hosts」文件,並且一旦計算機的密匙發生了變化,就拒絕連接。

IdentityFile ~/.ssh/identity
「IdentityFile」設置從哪個文件讀取用戶的RSA安全驗證標識。

Port 22
「Port」設置連接到遠程主機的埠。

Cipher blowfish
「Cipher」設置加密用的密碼。

EscapeChar ~
「EscapeChar」設置escape字元。

配置「/etc/ssh/sshd_config」文件
「/etc/ssh/sshd_config」是OpenSSH的配置文件,允許設置選項改變這個daemon的運行。這個文件的每一行包含「關鍵詞-值」的匹配,其中「關鍵詞」是忽略大小寫的。下面列出來的是最重要的關鍵詞,用man命令查看幫助頁(sshd (8))可以得到詳細的列表。

編輯「sshd_config」文件(vi /etc/ssh/sshd_config),加入或改變下面的參數:

# This is ssh server systemwide configuration file.
Port 22
ListenAddress 192.168.1.1
HostKey /etc/ssh/ssh_host_key
ServerKeyBits 1024
LoginGraceTime 600
KeyRegenerationInterval 3600
PermitRootLogin no
IgnoreRhosts yes
IgnoreUserKnownHosts yes
StrictModes yes
X11Forwarding no
PrintMotd yes
SyslogFacility AUTH
LogLevel INFO
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
AllowUsers admin

下面逐行說明上面的選項設置:

Port 22
「Port」設置sshd監聽的埠號。

ListenAddress 192.168.1.1
「ListenAddress」設置sshd伺服器綁定的IP地址。

HostKey /etc/ssh/ssh_host_key

「HostKey」設置包含計算機私人密匙的文件。

ServerKeyBits 1024
「ServerKeyBits」定義伺服器密匙的位數。

LoginGraceTime 600
「LoginGraceTime」設置如果用戶不能成功登錄,在切斷連接之前伺服器需要等待的時間(以秒為單位)。

KeyRegenerationInterval 3600
「KeyRegenerationInterval」設置在多少秒之後自動重新生成伺服器的密匙(如果使用密匙)。重新生成密匙是為了防止用盜用的密匙解密被截獲的信息。

PermitRootLogin no
「PermitRootLogin」設置root能不能用ssh登錄。這個選項一定不要設成「yes」。

IgnoreRhosts yes
「IgnoreRhosts」設置驗證的時候是否使用「rhosts」和「shosts」文件。

IgnoreUserKnownHosts yes
「IgnoreUserKnownHosts」設置ssh daemon是否在進行RhostsRSAAuthentication安全驗證的時候忽略用戶的「$HOME/.ssh/known_hosts」

StrictModes yes
「StrictModes」設置ssh在接收登錄請求之前是否檢查用戶家目錄和rhosts文件的許可權和所有權。這通常是必要的,因為新手經常會把自己的目錄和文件設成任何人都有寫許可權。

X11Forwarding no
「X11Forwarding」設置是否允許X11轉發。

PrintMotd yes
「PrintMotd」設置sshd是否在用戶登錄的時候顯示「/etc/motd」中的信息。

SyslogFacility AUTH
「SyslogFacility」設置在記錄來自sshd的消息的時候,是否給出「facility code」。

LogLevel INFO
「LogLevel」設置記錄sshd日誌消息的層次。INFO是一個好的選擇。查看sshd的man幫助頁,已獲取更多的信息。

RhostsAuthentication no
「RhostsAuthentication」設置只用rhosts或「/etc/hosts.equiv」進行安全驗證是否已經足夠了。

RhostsRSAAuthentication no
「RhostsRSA」設置是否允許用rhosts或「/etc/hosts.equiv」加上RSA進行安全驗證。

RSAAuthentication yes
「RSAAuthentication」設置是否允許只有RSA安全驗證。

PasswordAuthentication yes
「PasswordAuthentication」設置是否允許口令驗證。

PermitEmptyPasswords no
「PermitEmptyPasswords」設置是否允許用口令為空的帳號登錄。

AllowUsers admin
「AllowUsers」的後面可以跟著任意的數量的用戶名的匹配串(patterns)或user@host這樣的匹配串,這些字元串用空格隔開。主機名可以是DNS名或IP地址。

配置OpenSSH使其使用TCP-Wrappers inetd超級伺服器
TCP-WRAPPERS用來啟動和停止sshd1服務。當inetd運行的時候,它會從配置文件(默認為「/etc/inetd.conf」)中讀入配置信息。在配置文件中每一行的不同項是用TAB或空格分開。

第一步

編輯「inetd.conf」文件(vi /etc/inetd.conf)並加入這一行:

ssh stream tcp nowait root /usr/sbin/tcpd sshd ?i

注意:「-i」參數很重要,它說明sshd是被inetd運行的。在加入這一行后,通過發送一個SIGHUP信號(killall ?HUP inetd)來更新「inetd.conf」文件。

[root@deep /root]# killall -HUP inetd

第二步

編輯「hosts.allow」文件(vi /etc/hosts.allow)並加入這一行:

sshd: 192.168.1.4 win.openarch.com

這一行表示IP地址為「192.168.1.4」,主機名為「win.openarch.com」的計算機允許用ssh訪問伺服器。

下面這些「daemon」字元串(用於TCP-WRAPPERS)被sshd1使用:

sshdfwd-X11 (允許/禁止X11轉發).
sshdfwd- (TCP轉發).
sshdfwd- (port-name在/etc/services中定義。用於TCP轉發).

注意:如果準備使用ssh,一定要用在所有的伺服器上。如果十台安全的伺服器和一台不安全的伺服器配在一起,也談不上什麼安全性。

更多的資料
如果想查找詳細的資料可以用man命令查幫助頁,讀取相關信息:

$ man ssh (1) - OpenSSH secure shell client (remote login program)
$ man ssh [slogin] (1) - OpenSSH secure shell client (remote login program)
$ man ssh-add (1) - adds identities for the authentication agent
$ man ssh-agent (1) - authentication agent
$ man ssh-keygen (1) - authentication key generation
$ man sshd (8) - secure shell daemon

SSH1每用戶配置
第一步

為本地伺服器創建私有和公用密匙,執行下面的命令:

[root@deep]# su username
[username@deep]$ ssh-keygen1

舉個例子,顯示出來的結果可能是:

Initializing random number generator...
Generating p: ............................++ (distance 430)
Generating q: ......................++ (distance 456)
Computing the keys...
Testing the keys...
Key generation complete.
Enter file in which to save the key (/home/username/.ssh/identity): 【按下回車鍵】
Enter passphrase:
Enter the same passphrase again:
Your identification has been saved in /home/username/.ssh/identity.
Your public key is:
1024 37
14937757511251955533691120318477293862290049394715136511145806108870001764378494676831
29757784315853227236120610062314604405364871843677484233240919418480988907860997175244
46977589647127757030728779973708569993017043141563536333068888944038178461608592483844
590202154102756903055846534063365635584899765402181 username@deep.openarch.com
Your public key has been saved in /home/username/.ssh/identity.pub

注意:如果有多個帳號需要為每個帳號創建一個密匙。

你可能要為下面的伺服器創建密匙:

l Mail伺服器

l Web伺服器

l 網關伺服器

這允許對這些伺服器進行有限的訪問,例如,不允許用Mail伺服器的帳號訪問Web伺服器或網關伺服器。這樣可以增加整體的安全性,即使因為某種原因有一個密匙被泄密了,也不會影響到其它的伺服器。

第二步

把本機的公用密匙(identity.pub)拷貝到遠程主機的「/home/username/.ssh」目錄下,例如,使用「authorized_keys」這個名字。

注意:拷貝文件的一個方法使用ftp命令,另一個辦法是把公用密匙用email(包含「~/.ssh/identity.pub」文件的內容)發給系統管理員。

改變pass-phrase

用加上「-p」參數的「ssh-keygen」命令,在任何時候都可以改變pass-phrase。用下面的命令,改變pass-phrase:

[root@deep]# su username
[username@deep]$ ssh-keygen1 ?p

Enter file key is in (/home/username/.ssh/identity): [按下回車鍵]
Enter old passphrase:
Key has comment username@deep.openarch.com
Enter new passphrase:
Enter the same passphrase again:
Your identification has been saved with the new passphrase.

OpenSSH用戶工具
下面列出的是一些我們經常要用到的命令,當然還有很多其它的命令,更詳細的信息可以查看man幫助頁或其它文檔。

ssh
ssh(Secure Shell)是用來登錄遠程計算機和在遠程計算機上執行命令的程序。它是用來替代rlogin和rsh,以及在不安全的網路環境下在兩台計算機之間提供安全和加密的信息交流。X11連接和TCP/IP埠可以被轉發到一個安全的通道里。

用下面的命令,登錄遠程計算機:

[root@deep]# ssh

例如:

[root@deep]# ssh username www.openarch.com
username@deep.openarch.com』s password:
Last login: Tue Oct 19 1999 18:13:00 -0400 from gate.openarch.com
Welcome to www.openarch.com on Deepforest.

是用來登錄ssh伺服器的用戶名,是ssh伺服器主機的地址。

scp
可以用這個命令把文件從本地計算機拷貝到遠程計算機,或者反之,甚至可以在兩台遠程計算機之間用「scp」命令拷貝文件。把遠程主機上的文件拷貝到當前目錄的一個簡單的方法如下。

用下面的命令把文件從遠程主機拷貝到本地主機上:

[root@deep /]# su admin
[admin@deep /]$ scp -p :/dir/for/file localdir/to/filelocation

例如:

[username@deep]$ scp -p username@mail:/etc/test1 /tmp
Enter passphrase for RSA key username@mail.openarch.com:
test1 | 2 KB | 2.0 kB/s | ETA: 00:00:00 | 100%

用下面的命令把文件從本地主機拷貝到遠程主機上:

[root@deep /]# su admin
[admin@deep /]$ scp -p localdir/to/filelocation :/dir/for/file

例如:

[username@deep]$ scp -p /usr/bin/test2 username@mail:/var/tmp
username@mails password:
test2 | 7 KB | 7.9 kB/s | ETA: 00:00:00 | 100%

注意:「-p」選項表示文件的改變和訪問時間屬性以及許可權,在拷貝過程中被保留。通常是需要這樣的。

安裝到系統中的文件
> /etc/ssh
> /etc/ssh/ssh_config
> /etc/ssh/sshd_config
> /etc/ssh_host_key
> /etc/ssh_host_key.pub
> /usr/bin/ssh
> /usr/bin/slogin
> /usr/man/man1/ssh.1
> /usr/man/man1/scp.1
> /usr/man/man1/ssh-add.1
> /usr/man/man1/ssh-agent.1
> /usr/man/man1/ssh-keygen.1
> /usr/bin/scp
> /usr/bin/ssh-add
> /usr/bin/ssh-agent
> /usr/bin/ssh-keygen
> /usr/man/man1/slogin.1
> /usr/man/man8/sshd.8
> /usr/sbin/sshd

Windows平台上免費的SSH客戶軟體
Putty
Putty的主頁:http://www.chiark.greenend.org.uk/~sgtatham/putty.html

Tera Term Pro and TTSSH
Tera Term Pro的主頁:http://hp.vector.co.jp/authors/VA002416/teraterm.html

TTSSH Homepage:http://www.zip.com.au/~roca/download.html

版權說明
這篇文章翻譯和改編自Gerhard Mourani的《Securing and Optimizing Linux: RedHat Edition》,原文及其版權協議請參考:www.openna.com。


[火星人 ] Linux系統中OpenSSH的安裝和配置已經有746次圍觀

http://coctec.com/docs/security/show-post-73055.html