第 7 堂課 - 遠端連線伺服器 ssh 與 VNC
上次更新日期 2018/11/22
一般來說,你的伺服器通常是放在機房或是雲裡面,因此,你很難對你的伺服器做物理的接觸 (直接站在伺服器螢幕前面操作系統的意思)。 所以,這時你通常得要透過網路來達成連線的任務。如果想要從你的工作機 (用戶端) 連線到機房的伺服器端 (Server) 進行類似螢幕前操作系統的功能, 那就得要透過遠端連線伺服器,包括文字界面的 sshd 以及圖形界面的 VNC 伺服器囉。
- 7.1: 遠端連線伺服器的資料加密機制
- 7.2: ssh 用戶端基本功能
- 7.3: sshd 的安全性設定
- 7.4: 使用圖形界面連線: VNC
- 7.5: 本日練習
- 7.6: 課後練習
7.1: 遠端連線伺服器的資料加密機制
一般來說,你的伺服器主機通常不會放在你的身邊,要知道,伺服器為了穩定運作,通常會加上工業用電腦風扇,這樣才能即時對系統散熱。 因此,通常伺服器會比較吵一點。另外,伺服器為了穩定以及方便網路連接,也通常會放在所謂的『機櫃』或者是放置於『機房』, 這些環境通常也是很吵又很冷,同時又因為資訊安全的關係,一般人是不能隨便進出的。這也是為啥我們說機房很難進出的緣故。
- 遠端連線伺服器
除了上述的原因之外,還有很多原因你也無法直接接觸到你的伺服器。舉例來說,在數值模式工作站 (其實就是運算能力比較大的主機系統) 的環境中, 經常有多位用戶會同時連上去操作他們的工作任務,也就是說,一部工作站可能要提供給整間實驗室的夥伴來進行程式設計與編譯等任務的 (因為某些軟體可能只有在工作站上面才有)。
除此之外,資傳系大三下學期學生開始進行專題製作之後,每一小組 (3~4人) 通常共用一個雲系統,雲系統其實就是一部雲裡面的 Linux 伺服器而已。 那一部 Linux 並沒有實體機器,同時,也沒有辦法提供給多個人同時操作的類似近端螢幕的功能。
如上所言,我們的系統很可能是要『同時』給多個人使用的。這時,就需要遠端連線伺服器幫助了!同時,在一般情況下,我們操作 Server 大概就是終端機文字界面, 但是,某些特殊情況下,我們是可能需要執行圖形界面的。因此:
- 透過純文字模式,目前主流為 ssh
- 透過圖形界面,包括 VNC, RDP 以及 Linux 模擬的 XRDP 功能!
- 遠端連線伺服器的加密機制
因為預設你可以透過文字界面以 root 的身份登入系統,所以,你下達的指令資料是會直接在網際網路上面傳輸的!此時,若你幫人家建置密碼, 如果使用明碼傳輸,很可能就會被竊取監聽而外流。因此,目前主流的 sshd 服務預設就是讓資料在網際網路上面加密傳輸, 這樣就不怕被竊取了。那麼什麼是金鑰加密系統呢?基本上他是:
- 公鑰 (public key):提供給遠端主機進行資料加密的行為,也就是說,大家都能取得你的公鑰來將資料加密的意思
- 私鑰 (private key):遠端主機使用你的公鑰加密的資料,在本地端就能夠使用私鑰來進行解密。由於私鑰是這麼的重要, 因此私鑰是不能夠外流的!只能保護在自己的主機上。
因此,Server 需要有一對公/私鑰, client 也要有自己的一對公/私鑰,並且將自己的公鑰傳給對方,保留自己的私鑰來進行解密。 而提供公鑰給對方,就是要對方以我自己的公鑰來加密的意思。整體的 Server / Client 金鑰傳輸系統有點像這樣:
- 當用戶端要傳送資料給伺服器端,資料是如何進行加密與解密?(用誰的公鑰?用誰的私鑰?)
- 當伺服器端要傳送資料給用戶端,資料是如何進行加密與解密?(用誰的公鑰?用誰的私鑰?)
- 所以,那一個鑰匙是不能夠外流的?
7.2: ssh 用戶端基本功能
基本上, CentOS 7 的系統預設就是啟動 sshd 伺服器的!而且預設的功能有底下幾點:
- 預設針對整個 Internet 放行
- 預設啟動的埠口為 port 22
- 預設提供了 root 進行遠端登入
- 同時提供 scp 與 sftp 等伺服器功能。
- 重新修改 ssh 的 port 22 埠口,讓這個 port 只對你的區域網路 (LAN) 以及 10.0.0.0/8 這個區網放行
- 常用的 ssh 服務之用戶端指令
常見的 ssh 協定的使用軟體有 ssh, scp, sftp 等,各個功能不太一樣。
- ssh:等於是遠端登入,然後取得伺服器終端機 (bash shell) 的一個方式
- scp:透過 ssh 協定進行檔案直接網路複製的功能
- sftp:透過 ssh 協定,進行類似 FTP 檔案傳輸的功能。
最常見的連線功能的基本語法如下:
[student@localhost ~]$ ssh [-f] [-o parms] [-p port] [account@]IP [command] # 直接用目前的身份登入某部伺服器的方式: [student@localhost ~]$ ssh 127.0.0.1 # 改用其他帳號登入某部伺服器的方式: [student@localhost ~]$ ssh root@127.0.0.1 # 重點在 @ 之前的帳號! # 直接在其他伺服器上面執行某個指令後結束 [student@localhost ~]$ ssh student@127.0.0.1 find / &> ~/find1.log # 與上述指令相同,但是交派指令後立即結束連線,讓伺服器自己執行後面的指令 (有沒有連線差很多) [student@localhost ~]$ ssh -f student@127.0.0.1 find / &> ~/find1.log # 不要詢問而是直接加入金鑰到紀錄檔中的方式 [student@localhost ~]$ ssh -o StrictHostKeyChecking=no root@localhost
- 嘗試回答,當出現底下的畫面時,應該要輸入哪個帳號的密碼才對?
- [student@localhost ~]$ ssh 127.0.0.1
- [root@localhost ~]# ssh 127.0.0.1
- [student@localhost ~]$ ssh root@127.0.0.1
- [root@localhost ~]# ssh student@127.0.0.1
- 使用 ssh root@localhost 來連接到自己的 ssh 伺服器,查看整個流程
- 登入後,查看自己家目錄的 .ssh 裡面有多出什麼資料?該資料的內容又如何?
- 登出 root 的連線
- 讓可信任的一般帳號可以輸入自己的密碼變成 root 的功能
從上面的練習我們會知道,多人共用的工作站、伺服器,可能會有多人同時需要擁有 root 的權限才行。那你要將 root 的密碼流出去嘛? 我覺得不妥~那如何處理呢?基本上,可以看看底下的說明:
- 一般帳號可以使用 su - 來切換身份,但是我們不要讓 root 的密碼流出去比較好!
- 在 CentOS 7 的環境下,使用者若加入 wheel 這個群組後,就可以使用自己的密碼來轉成 root 了!
- 這個方式相當適合於你用一般帳號以 ssh 登入系統後,再切換成為 root 喔!
也就是說:『你可以用 student 自己的密碼來切換身份變成 root 』,如此一來,大家都可以自由的使用自己的密碼變成 root 啦! 只要加入 wheel 群組就可以了。來做一個簡單的練習。
- 先登出 student (全部的界面都登出,包括圖形界面)
- 進入 tty2 的終端界面,使用 root 直接登入系統
- 使用 usermod 這個指令,參考 usermod --help 查閱相關參數,讓 student 擁有 wheel 群組支援
- 使用 id student 觀察是否加入了 wheel 群組了?
- 登出 root,離開 tty2 回到 tty1 的環境
- 使用 student 的身份登入 tty1 的圖形界面
- 打開終端機,使用『 id 』指令,查詢是否已經支援 wheel 群組 (這點一定要成功!)
- 使用『 sudo su - 』,並且輸入 student 自己的密碼,看看有沒有變成 root 呢?
透過上面的練習,你就可以知道如何使用 sudo su - 這一串指令了!
- 使用 scp 進行異地複製行為
你可以直接以 ssh 協定來進行檔案的傳輸!是檔案傳輸喔!不是透過其他通訊協定。scp 是可以直接以 ssh 通道來傳送檔案的一種方式, 使用上面就與 cp 相當類似,只是你得要加上遠端主機的帳號、IP與檔名而已。處理方式如下:
[student@localhost ~]$ scp [-pr] [-l 速率] file [帳號@]主機:目錄名 # 上傳的行為 [student@localhost ~]$ scp [-pr] [-l 速率] [帳號@]主機:file 目錄名 # 下載的行為 -p :保留原本檔案的權限資料; -r :複製來源為目錄時,可以複製整個目錄 (含子目錄) -l :可以限制傳輸的速度,單位為 Kbits/s ,例如 [-l 800] 代表傳輸速限 100Kbytes/s -P port:如果 ssh 開在非正規埠口,可以使用這個大寫 P 來指定埠口號碼
到底是上傳還是下載?可以透過觀察上述指令的冒號 (:) 來分析即可!那個冒號的所在處,就是遠端機器的位置,你就可以知道上傳還是下載了。
- 先使用 student 的帳號,在自己的家目錄裡面建立一個名為你的學號的檔名,例如 AXXXCYYY.txt 這樣的檔案,檔名開頭請務必為大寫 A。 然後內容填寫你悄悄話,不要跟你的同伴講。等到完成後,告知同學你已經處理完畢,同時告知同學你的 IP 是多少?
- 取得同學的 IP 與檔名之後,使用『 scp student@同學的IP:/home/student/AXXXCYYY.txt . 』下載到本目錄,然後查看同學寫些什麼?
- 將同學的 /etc/sysconfig/network-scripts 整個目錄複製到本機的 /dev/shm 底下去。
7.3: sshd 的安全性設定
sshd 的設定主要是在 /etc/ssh/sshd_config 這個檔案裡面做設定,其中預設的設定值已經是挺完整的了,不過還是有需要進行一些更嚴格的設定較佳。 此外,防火牆的規劃也請額外處理一下才好。
- 連線埠口的更改
某些時刻,可能由於計算機中心管制的問題,以及 port 重複利用的問題,或者是其他各企業規範政策所致,你可能無法使用正規的 port 22 來處理你的 ssh。 此時你可以調整 ssh 的埠口號碼,建立在非正規的埠口上。唯一的好處是,可能可以略過一些常見的 ssh 攻擊掃描問題。
- 修改 /etc/ssh/sshd_config 內容,建立兩個 Port 項目,亦即 Port 22 以及 Port 543,設定完請重新啟動 sshd 服務。
- 並使用 netstat 觀察監聽的埠口是否正確擁有 543 了。
- 在用戶端使用這個埠口來進行 (1)登入與 (2)複製 /etc/pam.d 到用戶端的 /dev/shm 底下去!(你可能需要用 root 身份)
- 防火牆處理
啟動了埠口後,我們還是希望不要讓這個 port number 對全世界放行。因此,你可能需要調整一下你的防火牆規則才好。
- 預設將 port 543 對全世界封閉 (reject)
- 針對 192.168.0.0/16 放行,同時針對 10.0.0.0/8 放行
- 針對 192.168.99.99 這個 IP 拒絕其連線
防火牆制定規則中,大致上的條件幾乎是『小範圍的先進行,再管理大範圍的』情況,所以上述的情況也需要做一些修訂才行喔!
- 取消 root 登入權限
一般來說,要攻擊你的系統,從『軟體漏洞』攻擊最快!因為無須猜測你的帳號密碼。但如果沒有漏洞的軟體存在時,那麼攻擊者恐怕就會轉而處理猜測你的密碼。 而整個 Linux 系統一定會存在的帳號,那當然就是 root 這個帳號了!因此,如果你讓 root 可以使用 ssh 登入系統的話,那麼攻擊者就很可能一直猜測你的 root 密碼。 所以,通常我們建議你關閉 root 的登入權,改由一般帳號登入系統,然後再轉換身份來處理較佳。
- 修改 /etc/ssh/sshd_config,讓 root 無法繼續使用 sshd 服務,同時需要重新啟動 sshd 喔!
- 嘗試使用 ssh root@localhost 看看,查閱一下 systemctl status sshd, /var/log/secure 等檔案,看看出現的問題為何?
- 測試完畢後,請再次讓 root 可以使用 sshd 喔!
7.4: 使用圖形界面連線: VNC
VNC server 會在伺服器端啟動一個監聽用戶要求的埠口,一般埠口號碼在 5901 ~ 5910 之間。當用戶端啟動 X server 連線到 5901 之後, VNC server 再將一堆預先設定好的 X client 透過這個連線傳遞到用戶端上,最終就能夠在用戶端顯示伺服器的圖形介面了。
不過需要注意的是,預設的 VNC server 都是獨立提供給『單一』一個用戶端來連線的,因此當你要使用 VNC 時,再連線到伺服器去啟動 VNC server 即可。所以,一般來說, VNC server 都是使用手動啟動的,然後使用完畢後, 再將 VNC server 關閉即可。
- tigervnc-server 是伺服器端軟體
- tigervnc 是用戶端軟體
至於啟動/關閉 VNC server 的方式為:
[student@localhost ~]$ vncserver [:號碼] [-geometry 解析度] [options] # 啟動 VNC Server [student@localhost ~]$ vncserver [-kill :號碼] # 關閉 VNC server
- 在 Server 端的操作:
- 以 student 的身份,啟動 VNC 埠口在 5905 上面
- 第一次操作時需要輸入密碼,密碼需要至少 6 個字元以上
- 啟動完成後,請使用 netstat 檢查是否順利啟動了。
- 前往 student 家目錄下,觀察 ~/.vnc 目錄,了解密碼檔案是那一個?
- 若需要修改密碼,可以參考 vncpasswd 指令的處理方式即可。
- 不建議 port 對全世界放行,不過如果需要針對外部某個 IP 來源放行,則請修改防火牆。例如放行 192.168.0.0/16 的連線!
- 在 client 端的操作:
- 必須要是在 GUI 的環境下才能夠操作連線功能
- 最簡單的方式,使用 vncviewer IP:port 即可連線,當然還是需要輸入密碼的。
- 嘗試開機執行 VNC 功能
VNC 一般建議用到才啟動,用完就關閉,不要持續啟動。不過在某些情境下 (例如鳥哥透過 VNC 操作 Server 的模式運算), 你或許需要開機就啟動喔!這時就得要使用特別的方式來啟用了!
- 若尚未關閉 port 5905 ,請立刻關閉他!
- 使用 rpm -ql tigervnc-server ,找出 systemd 的設定檔所在處
- 參考上述檔案的內容的說明,一步一步設定好 VNC 的處理!
- 將該服務設定為啟動,且開機就啟動 (systemd [start|enable])。
7.5: 本日練習
現在來複習一下今日的動作,作為本日的點名與查驗資訊。請在目前的雲端機器上面完成底下的實做,要完成且讓老師檢查完畢後,才可以離開教室喔!
- 建立一個可信任的一般帳號 (該帳號可以使用 sudo su - 的意思)
- 使用 useradd 新建一個名為 myadm 的帳號,且密碼為 iamadmqq
- 使用 usermod 讓這個帳號加入 wheel 群組的支援
- 請在 tty3 使用 myadm 帳號登入
- 請使用『 sudo su - 』這個指令,並且輸入 myadm 看看帳號變成什麼了?
- 最終請用 exit 恢復原本的身份,然後登出 tty3 吧!
- 使用 student 的身份,啟動一個 VNC 在 port 5909 上面
- 請啟用 ssh 放行在埠口 port 22, 5353 這兩個上面
- 重新修改 ssh 的 port 22, 5353 埠口,讓這兩個 port 只對你的區域網路 (LAN) 以及 10.0.0.0/8 這個區網放行
- 請以 student 身份,從 192.168.40.100 這部主機上,取得 /home/student/checking.data 這個檔案,並且將這個檔案放置到 /root/ 底下去
7.6: 課後練習
請撰寫一個 word 檔案,檔名為:『 unit07-A050cxxx-你的名字.docx 』,內容回答下列問題,然後每週作業上傳到對應的 EP 上面去:
- 成對的金鑰系統有公鑰與私鑰,請問,(1)那一把鑰匙在加密?(2)那一把鑰匙在解密?(3)那一把鑰匙是不能流出去的?
- sshd 伺服器的設定檔,預設檔名為何?
- 預設的 sshd 伺服器埠口是幾號?
- 說明 ssh 與 scp 的功能各為何?
- 如何讓 student 可以使用 sudo 這個指令?
- 要啟動 vncserver 時,需要安裝哪個軟體才可以?
- 要使用 vncviewer 時,需要安裝哪個軟體才可以?
同場加映:不用上傳的資料,請 google 一下打字時,手指與鍵盤指法的對應,然後自由練習底下的資訊:
- 小寫的 a~z (abcdefg...xyz) ,共打 10 次
- 小寫的 0~9,a~z (012..89abcdefg...xyz) ,共打 10 次
- 不要啟動大寫燈,用組合按鍵輸入 A-Z (ABCD...XYZ),共 10 次
每天上課各練一次,最慢 10 天,你的打字就會嚇嚇叫了!