Linux伺服器 Linux伺服器

網站伺服器建置與管理 - RockyLinux 9

網站伺服器建置與管理 > 課程內容 > 第 6 堂課 - 遠端連線伺服器 sshd, VNC 與 XRDP

第 6 堂課 - 遠端連線伺服器 sshd, VNC 與 XRDP

上次更新日期 2022/10/10

較有規模的公司,伺服器都是放在機房的。至於像校園系所的伺服器,或老師個人的伺服器,可能就只是放在某個角落沒有接上螢幕的主機而已。 因此,要登入這些設備,就得要透過網路連接到系統裡面去。連接到伺服器的方法有純文字模式與圖形界面模式, 純文字模式幾乎一定是用 sshd 這個服務,至於圖形界面則可能是 VNC 或 XRDP 囉!

學習目標

  • 了解金鑰系統,比較能熟悉免密碼登入的 ssh 功能
  • 熟悉 sshd 協定,包括使用 rsync 也是透過 sshd 協定的任務
  • 進行 sshd 的安全強化
  • 了解使用 VNC/XRDP 等圖形界面協定
  • 6.1: 遠端連線伺服器與連線加密的金鑰系統
  • 6.2: ssh 的指令功能: ssh, scp, sftp
  • 6.3: ssh 協定的安全設定
  • 6.4: ssh 的常見應用
  • 6.5: 使用圖形界面連線: VNC
  • 6.6: 使用圖形界面連線: XRDP
  • 6.7: 課後練習

6.1: 遠端連線伺服器與連線加密的金鑰系統

通常要連到 server 並不是坐在 server 實體主機前面,透過螢幕鍵盤與滑鼠來取得終端機。 因為 server 通常都是放在機房,或者是藏在某些空間,你很不容易透過實際物理方式來接觸到 server 實體主機的。 所以,當你要使用的時候,就需要透過所謂的遠端連線伺服器服務,以網路取得伺服器的虛擬終端界面才對!

  • 什麼是遠端連線伺服器

所謂的連線到伺服器的功能,主要就是:透過遠端連線的功能登入到伺服器,經常使用於工作站,或者是多人共用伺服器的環境, 包括科學運算過程當中需要用到的數值模式模擬環境。而常見的模式則有:

  • 透過純文字模式,目前主流為 ssh
  • 透過圖形界面,包括 VNC, RDP 以及 Linux 模擬的 XRDP 功能!

因為我們透過連線伺服器的功能,然後就可以在遠端對伺服器下達各種命令。因此,如果我們所傳達的任何命令或指令或動作, 以一般的明碼進行傳送時,很可能就會在傳輸的路上被竊取而遭受進一步的攻擊。所以,早期明碼傳輸的 telnet 與 rsh 才會被淘汰。 而近期使用 ssh 則是因為資料在 server / client 之間傳送時,是經過加密的行為,因此網路上竊取的資料就不會被輕易的解析出來, 對於資料而言,當然是相對較為安全。

  • 連線加密的金鑰系統

那麼所謂的加密是怎麼回事呢?基本上就是發送端會先透過一個機制來加密,而接收端就透過相對的機制來進行解密。 這兩個機制必須要有相關性啊,這就是所謂的成對金鑰系統。

  • 公鑰 (public key):提供給遠端主機進行資料加密的行為,也就是說,大家都能取得你的公鑰來將資料加密的意思
  • 私鑰 (private key):遠端主機使用你的公鑰加密的資料,在本地端就能夠使用私鑰來進行解密。由於私鑰是這麼的重要, 因此私鑰是不能夠外流的!只能保護在自己的主機上。
ssh 金鑰系統

因此,Server 需要有一對公/私鑰, client 也要有自己的一對公/私鑰,並且將自己的公鑰傳給對方,保留自己的私鑰來進行解密。 而提供公鑰給對方,就是要對方以我自己的公鑰來加密的意思。整體的 Server / Client 金鑰傳輸系統有點像這樣:

ssh 金鑰系統

例題 6.1.A:了解金鑰的發放與保存:
  1. 當用戶端要傳送資料給伺服器端,資料是如何進行加密與解密?(用誰的公鑰?用誰的私鑰?)
  2. 當伺服器端要傳送資料給用戶端,資料是如何進行加密與解密?(用誰的公鑰?用誰的私鑰?)
  3. 所以,那一個鑰匙是不能夠外流的?

例題 6.1.B:了解 ssh 的連線行為與產生的各項金鑰資訊 (請同時啟動 server 與 client 兩個系統)
  1. 個人金鑰系統的檔案紀錄功能:
    1. 先在 client 系統上面的 student 用戶,看看有沒有 ~/.ssh/ 這個目錄的存在?若有,則請觀察該目錄的權限為何?
    2. 使用『 ssh localhost 』,並且輸入 yes 之後,再輸入 student 密碼,看看能否登入系統了?
    3. 登入之後,使用『 netstat -atnp 』查閱一下有沒有 port 22 的連線存在?
    4. 現在請離開這次的 ssh 連線
    5. 查閱一下 student 家目錄下的 ~/.ssh/known_hosts 檔案內容,是否有 localhost 的金鑰存在?
  2. 系統整體金鑰檔案的放置位置與 sshd 啟動呼叫金鑰的流程理解:
    1. 現在使用 root 的身份在 client 系統上,並且進入 /etc/ssh 這個目錄,然後理解一下公鑰與私鑰的可能檔名為何?
    2. 將金鑰系統移動到 /tmp 去,然後重新啟動 sshd 這個服務,有沒有產生新的金鑰?
    3. 使用另一個終端機,以 student 的身份,再次執行『 ssh localhost 』,會出現什麼問題?
    4. 回到 root 的視窗,刪除新的金鑰,將舊的金鑰移動回來,重新啟動 sshd 服務
    5. 再以 student 身份重新執行『 ssh localhost 』有沒有恢復正常的登入流程?為什麼會這樣?
    6. 若要刪除記載的金鑰,該如何處理? (請使用 vim 來處理)

6.2: ssh 的指令功能: ssh, scp, sftp

常見的 ssh 協定的使用軟體有 ssh, scp, sftp 等,各個功能不太一樣。

  • ssh:等於是遠端登入,然後取得伺服器終端機 (bash shell) 的一個方式
  • scp:透過 ssh 協定進行檔案直接網路複製的功能
  • sftp:透過 ssh 協定,進行類似 FTP 檔案傳輸的功能。
  • ssh 連線功能

這個指令基本的操作方式如下說明:

[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
  • sshd 的加密機制

sshd 支援相當多的加密機制,由於加密功能漸漸廣泛,因此許多的 CPU 加密指令集就被開發出來,其中比較重要的就是 AES 加密機制。 sshd 也支援此種加密機制,除了可以加快傳輸之外,也可以避免被攻擊的情境。若需要了解 sshd 支援的加密機制,可以使用底下的方式查詢:

[root@localhost ~]# sshd -T | grep -i cipher

但事實上,傳輸是需要兩方面具有相同的功能,所以,如果是兩部不同 distribution 的系統,那兩部主機會自動協調可用的參數來傳輸。

例題 6.2.A:請回答下列問題:
  1. 嘗試回答,當出現底下的畫面時,應該要輸入哪個帳號的密碼才對?
    • [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
  2. 預設的 ssh 加密為 AES 加密機制,由於涉及加密的速度,因此目前很多的 CPU 會加入 AES 這個指令集。請查出你系統 CPU 是否有支援 AES 呢? (hint: 找 /proc/cpuinfo 就對了)
  3. 如果你需要更高階的加密計算,可以使用 256bit 的 aes 加密機制 (如上,使用 sshd -T 去查詢支援度),而不是使用預設的機制。 如果要強迫使用 aes128-gcm@openssh.com 這個機制(或其他機制),該如何處理? (hint: ssh 需要 -c 的選項,而 scp 需要 -o 的選項功能喔! 此外,建議 ssh 加上 -v 的參數來查詢連線階段的訊息輸出)
  • 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 來指定埠口號碼

到底是上傳還是下載?可以透過觀察上述指令的冒號 (:) 來分析即可!那個冒號的所在處,就是遠端機器的位置,你就可以知道上傳還是下載了。

例題 6.2.B:實際執行下列動作:
  1. 在 Server 上,以 root 身份將 /etc/host* 連同目錄喔!完整的複製到 client 的 /dev/shm/checking/ 目錄下,遠端身份請使用 student 喔!
  2. 在 Server 上面以 dd 建立一個大約 500M 的檔案,放置到 /dev/shm 底下喔。然後以 chacha20-poly1305@openssh.com 的運算機制,將檔案複製到 client 的 /dev/shm 底下去。
  3. 承上,你不想要太花系統頻寬,因此預計使用 1Mbytes/s 的速度來傳輸,又該如何處理?
  • sftp 類似 ftp 用戶端軟體,但透過 ssh 協定

如果你習慣使用 FTP 的用戶端軟體,那就直接以 ssh 提供的 sftp 來處置即可。基本上,你可以在用戶端選擇以 GUI 的軟體來執行檔案的傳輸, 不但連線加密,還與 FTP 的功能完全一致。基本上,有 scp 你應該會比較少使用 sftp 的!所以這裡僅是告知你有這個功能,相關的指令就不介紹了。

  • 以 ssh 取得遠端 X 軟體的操作權

某些時刻,你可能需要從遠端取得圖形化界面,但是遠端伺服器其實並沒有圖形界面的存在,只是有圖形界面的軟體而已。那該如何是好? 其實,你可以在 client 端以 X server 來操作伺服器的 X client 喔!不過,因為 X 的執行需要在伺服器端有 X 軟體以及驗證功能,所以, 你的伺服器需要先安裝某些特殊軟體才行!

例題 6.2.C:在伺服器端安裝 X 軟體以及驗證工具 (X client 軟體)
  1. 在伺服器端的軟體:
    • 先安裝可以提供圖形界面終端機的 xterm 這個軟體包;
    • 因為需要提供操作者的驗證,因此還需要安裝 xauth 這個軟體包
  2. 在用戶端 GUI 的環境下,執行:『 ssh -X account@IP xterm 』等,來執行伺服器端的 X client 軟體。 未來若有其他需求,直接修改 xterm 成為你要執行的軟體即可!

進行上述練習時,在 Client 端執行軟體時,最好都用原生的圖形界面操作者,不要切換身份來執行較佳。

6.3: ssh 協定的安全設定

sshd 的設定主要是在 /etc/ssh/sshd_config 這個檔案裡面做設定,其中預設的設定值已經是挺完整的了,不過還是有需要進行一些更嚴格的設定較佳。 此外,防火牆的規劃也請額外處理一下才好。

  • 連線埠口的更改

某些時刻,可能由於計算機中心管制的問題,以及 port 重複利用的問題,或者是其他各企業規範政策所致,你可能無法使用正規的 port 22 來處理你的 ssh。 此時你可以調整 ssh 的埠口號碼,建立在非正規的埠口上。唯一的好處是,可能可以略過一些常見的 ssh 攻擊掃描問題。

例題 6.3.A:我們想要修改 ssh port,讓它同時存在 port 22 以及 port 5533 ,該如何處理?
  1. 事前準備:由於出自於 SELinux 的問題,因此你最好已經安裝了 setroubleshoot-* 等軟體!
  2. 修改 /etc/ssh/sshd_config 內容,建立兩個 Port 項目,亦即 Port 22 以及 Port 5533,設定完請重新啟動 sshd 服務。
  3. 使用 systemctl status sshd 時,會發現錯誤!無法啟用 port 5533 ,請查詢 /var/log/messages 的內容,並據以修改。
  4. 上述改完之後,請再次啟動 sshd,並使用 netstat 觀察監聽的埠口是否正確擁有 5533 了。
  5. 在用戶端使用這個埠口來進行 (1)登入與 (2)複製 /etc/pam.d 到用戶端的 /dev/shm 底下去!(你可能需要用 root 身份)
  • 防火牆處理

啟動了埠口後,我們還是希望不要讓這個 port number 對全世界放行。因此,你可能需要調整一下你的防火牆規則才好。

例題 6.3.B:這個 sshd 5533 的埠口只針對某些 IP 來放行的喔!
  • 預設將 port 5533 對全世界封閉 (reject)
  • 針對 172.16.0.0/16 放行,同時針對 10.0.0.0/8 放行
  • 針對 172.16.99.99 這個 IP 拒絕其連線

防火牆制定規則中,大致上的條件幾乎是『小範圍的先進行,再管理大範圍的』情況,所以上述的情況也需要做一些修訂才行喔!

  • 取消 root 登入權限

一般來說,要攻擊你的系統,從『軟體漏洞』攻擊最快!因為無須猜測你的帳號密碼。但如果沒有漏洞的軟體存在時,那麼攻擊者恐怕就會轉而處理猜測你的密碼。 而整個 Linux 系統一定會存在的帳號,那當然就是 root 這個帳號了!因此,如果你讓 root 可以使用 ssh 登入系統的話,那麼攻擊者就很可能一直猜測你的 root 密碼。 所以,通常我們建議你關閉 root 的登入權,改由一般帳號登入系統,然後再轉換身份來處理較佳。

例題 6.3.C:取消 root 遠端登入的權限
  1. 修改 /etc/ssh/sshd_config,讓 root 無法繼續使用 sshd 服務,同時需要重新啟動 sshd 喔!
  2. 嘗試使用 ssh root@localhost 看看,查閱一下 systemctl status sshd, /var/log/secure 等檔案,看看出現的問題為何?
  3. 測試完畢後,請再次讓 root 可以使用 sshd 喔!
  • 建立不可使用 ssh 登入的用戶

以鳥哥為例,我必須要建立給學生上課用來傳輸網頁的伺服器,且第一次讓學生操作時,需要強迫他們重新設定自己的密碼,因此學生帳號必須要能夠使用 ssh 才行。 但是在處理完畢這件事情之後,鳥哥希望學生不要使用 ssh 來登入這個系統,因為擔心某些資料會被亂用。因此,我就得要讓他們再也無法使用 ssh, 不過,卻是可以使用任何功能的條件。

在此設計的角度上,讓 shell 變成 /sbin/nologin 也是一個作法,只是這樣一來,連本地端 (tty1~tty6) 也無法登入,這與當初只想要關閉 ssh 的使用不太一樣。 此時,我們可以使用 sshd_config 提供的功能來設計!

例題 6.3.D:建立無法使用 ssh 的帳號
  1. 先使用 man sshd_config 的方式,搜尋 denygroups 的設定值,觀察如何設定與它的功能為何?
  2. 建立一個 denyssh 的群組,而且將這個群組設定到無法使用 sshd 的參數中 (你應該要重新啟動 sshd)
  3. 建立一個 usera 的帳號,這個帳號還加入 denyssh 的次要群組,同時密碼為 1234hehe!
  4. 嘗試用 tty3 登入這個帳號
  5. 嘗試用 ssh usera@localhost 登入系統

未來你只要讓任何不想讓他使用 ssh 的帳號,將該帳號加入 denyssh 的群組,他就無法使用 ssh 的功能囉!

  • 不修改 ssh port 增加 ssh port 連線埠口的功能

事實上,你依舊使用 port 22 來管理 ssh 即可,只是,讓你的某個方向的連線增加一個 port mapping 的功能即可。 舉例來說,你如果需要使用 5555 這個 port 來連線到 ssh 的話,那麼可以使用底下的方式來處理即可:

iptables -t nat -A PREROUTING -p tcp --dport 5555 -j REDIRECT --to 22

這樣,雖然對方還是連線到你的 port 5555,但是因為上面這段的關係,該連線被重新導向 port 22 去了!這樣還不用修改 ssh 呢! 比較有趣!比較有趣!

6.4: ssh 的常見應用

ssh 除了可以讓你登入與傳送檔案之外,其實他還經常被拿來作為自動異地備份的相關功能之中。不過,如果想要讓系統自動於背景中進行異地備援, 就得要建立無須密碼登入的帳號~這就需要用到預先設定好的金鑰系統才行。

底下例題的目的是:在 Server 上面使用 root 的身份,將重要資料複製到 client 端去!因為涉及權限,因此建議兩者均用 root。 但是因為 server 的 root 可能已經被拒絕使用 ssh 囉,所以才用 server 主動的提供到 client 去的方向。

例題 6.4.A:從連線發起端建立金鑰後,再將公鑰上傳到接收端的方式:
  1. 在連線發起端使用 root ,以『 ssh-keygen 』來建立兩把金鑰,注意看 ~/.ssh 的內容!
  2. 在連線發起端使用 root 以『 ssh-copy-id -i filename account@IP 』來處理金鑰的上傳
  3. 在連線發起端使用 root 以『 ssh account@IP date 』來測試是否需要密碼?
  4. 在連線接收端,使用相對應的帳號來觀察 ~/.ssh 內部檔案的變化。
  • 使用 rsync 處理異地備援

如果你的檔案是一直更新的,那麼使用 scp 即可。如果你的檔案不是一直更新,而是持續累加不同的檔案時,使用 scp 有點困擾! 因為沒有更新的檔案透過 scp 還是會重新複製一次。因此,這時可以比對兩邊資料後,只上傳較新的檔案的方式,就是你應該要學會的技術了。 那就是 rsync 這個指令囉。

[student@localhost ~]$ rsync [-avrlptgoD] [-e ssh] [user@host:/dir] [/local/path]

-v :觀察模式,可以列出更多的資訊,包括鏡像時的檔案檔名等;
-q :與 -v  相反,安靜模式,略過正常資訊,僅顯示錯誤訊息;
-r :遞迴複製!可以針對『目錄』來處理!很重要!
-u :僅更新 (update),若目標檔案較新,則保留新檔案不會覆蓋;
-l :複製連結檔的屬性,而非連結的目標原始檔案內容;
-p :複製時,連同屬性 (permission) 也保存不變!
-g :保存原始檔案的擁有群組;
-o :保存原始檔案的擁有人;
-D :保存原始檔案的裝置屬性 (device)
-t :保存原始檔案的時間參數;
-I :忽略更新時間 (mtime) 的屬性,檔案比對上會比較快速;
-z :在資料傳輸時,加上壓縮的參數!
-e :使用的通道協定,例如使用 ssh 通道,則 -e ssh
-a :相當於 -rlptgoD ,所以這個 -a 是最常用的參數了!

因為就是使用 ssh 的協定,因此上傳或下載,就是查看冒號 (:) 所在處囉!另外,使用 rsync 時,需要特別注意:

  • Server 與 Client 兩端都需要安裝 rsync 才能夠順利的運作喔!!
  • 如果兩端帳號身份相同,可以配合 -av 來處理所有權限同步
  • 如果兩端帳號身份不相同,建議使用 -rlt 參數來複製較佳。
例題 6.4.B:開始處理 ssh 協定的工作:
  1. 先確認 server/client 都有 rsync 這個指令的存在才好!
  2. 在 Client 用 root 帳號身份,將 /root, /etc 目錄備份到 Server 的 student 家目錄下的 backups 目錄中
  3. 重複上一個動作,結果會如何?
  4. 如果需要使用到 port 5533 時,又該如何下達指令?
  5. 定期於每日 2 點執行一次備份功能。
  • 使用個人 ~/.ssh/config 設定檔

如果懶的記憶許多的主機名稱 / IP位址,可以透過設定檔來紀錄相關設定。舉例來說:

  • 假定主機名稱 myadm 連線到 192.168.254.4,透過帳號 myadm 連線
  • 假定主機名稱 web 連線到 192.168.254.23,透過帳號 web 連線
  • 假定主機名稱 dbuser 連線到 192.168.254.16,透過帳號 dbuser 連線

上述設定均可使用底下的語法來處理:

Host myadm
Hostname 192.168.254.4
User myadm
Port 22

6.5: 使用圖形界面連線: VNC

VNC server 會在伺服器端啟動一個監聽用戶要求的埠口,一般埠口號碼在 5901 ~ 5910 之間。當用戶端啟動 X server 連線到 5901 之後, VNC server 再將一堆預先設定好的 X client 透過這個連線傳遞到用戶端上,最終就能夠在用戶端顯示伺服器的圖形介面了。

不過需要注意的是,預設的 VNC server 都是獨立提供給『單一』一個用戶端來連線的,因此當你要使用 VNC 時,再連線到伺服器去啟動 VNC server 即可。所以,一般來說, VNC server 都是使用手動啟動的,然後使用完畢後, 再將 VNC server 關閉即可。

例題 6.5.A:安裝需要的軟體
  • 雖然說在 Server 端安裝 tigervnc-server 即可,不過為了取得良好的顯示效果,我們還需要至少安裝一些桌面顯示功能才好!
  • 除了 tigervnc-server 之外,根據分析 /etc/X11/xinit/xinitrc 以及 /etc/X11/xinit/Xclients, 我們決定持續安裝底下的軟體較佳:
    • gnome-session
    • gnome-classic-session
    • gnome-terminal
  • 在 client 端安裝 tigervnc 即可。

至於啟動/關閉 VNC server 的方式為:

[student@localhost ~]$ vncserver [:號碼] [-geometry 解析度] [options] # 啟動 VNC Server
[student@localhost ~]$ vncserver [-kill :號碼]                        # 關閉 VNC server
例題 6.5.B:開始測試 VNC server 的使用
  • 在 Server 端的操作:
    • 以 student 的身份,啟動 VNC 埠口在 5905 上面
    • 第一次操作時需要輸入密碼,密碼需要至少 6 個字元以上
    • 啟動完成後,請使用 netstat 檢查是否順利啟動了。
    • 前往 student 家目錄下,觀察 ~/.vnc 目錄,了解密碼檔案是那一個?
    • 若需要修改密碼,可以參考 vncpasswd 指令的處理方式即可。
    • 不建議 port 對全世界放行,不過如果需要針對外部某個 IP 來源放行,則請修改防火牆。例如放行 172.16.0.0/16 的連線!
  • 在 client 端的操作:
    • 必須要是在 GUI 的環境下才能夠操作連線功能
    • 最簡單的方式,使用 vncviewer IP:port 即可連線,當然還是需要輸入密碼的。
  • 嘗試開機執行 VNC 功能

VNC 一般建議用到才啟動,用完就關閉,不要持續啟動。不過在某些情境下 (例如鳥哥透過 VNC 操作 Server 的模式運算), 你或許需要開機就啟動喔!這時就得要使用特別的方式來啟用了!

例題 6.5.C:開機就啟用 VNC 這個服務
  • 若尚未關閉 port 5905 ,請立刻關閉他!
  • 使用 rpm -ql tigervnc-server ,找出 systemd 的設定檔所在處
  • 參考上述檔案的內容的說明,一步一步設定好 VNC 的處理!
  • 將該服務設定為啟動,且開機就啟動 (systemd [start|enable])。
  • 嘗試使用 ssh 通道加密 VNC 的連線

一般正常情況下,VNC 預設是不加密的。如果 Server/client 你都可以使用 ssh 連線溝通的話,那麼我們可以透過 ssh 的隧道功能 (tunnel) 來進行連線, 達成在這條通道內的任何資料傳遞!你可以參考例題 6.5.C 找到的那個檔案的介紹,直接在用戶端這樣處理即可:

例題 6.5.D:透過 ssh 通道,直接連接未加密的 VNC ,以 ssh 通道達成加密的 VNC 視窗。請注意,底下的動作全部都在 client 進行即可!
  • 先開啟一個視窗,輸入『 ssh -v -C -L 5905:localhost:5905 account@VNC_Server_IP 』,輸入 account 密碼,此時就會有一條通道連接到 VNC server 上, 而 5905:localhost:5905 ,左側的 5905 指的是用戶端 (localhost) 開啟的監聽埠口,而右側的 5905 則是 VNC server 所啟動的埠口,這兩個埠口可以不一致, 不過如果不影響本機的服務,建議兩者相同即可。
  • 再開一個視窗,輸入『 vncviewer localhost:5905 』即可取得圖形界面。

透過上述取得的 VNC 畫面,其實是透過 ssh 的通道,因此你會發現兩個視窗的訊息非常的多!這是因為 VNC 連線的所有資訊都會在這條隧道內顯示的意思! 你就無須自行尋找 VNC 的加密囉!因為 ssh 真是萬能!

6.6: 使用圖形界面連線: XRDP

我們知道 Windows 的遠端桌面 (Remote Desktop Procotol, RDP) 其實是具有連線加密功能的,所以,能不能在 Linux 上面裝一個 RDP Server 呢?是可以的,那就是 XRDP 伺服器

很可惜的是,我們的 RockyLinux 9 預設並沒有提供 XRDP 的伺服器,如果你有興趣的話,可以自行編譯 xrdp 軟體, 但鳥哥有找到 Fedora 基金會提供的 RHEL 額外軟體計畫,請依據第一堂課的例題 1.2.C 的方式建立好 EPEL 這個 repo 的 yum 來源伺服器,然後以底下的方式來安裝好你的 xrdp 喔!

[root@localhost ~]# yum --enablerepo=epel install xrdp

安裝完畢之後,你就可以立刻啟動 xrdp 了!因為幾乎所有的設定值都已經處理妥當~不須額外的其他設定。 只是有可能得要處理一下防火牆就是了。

例題 6.6.A:啟動與觀察 XRDP 伺服器
  1. 編輯 /etc/xrdp/xrdp.ini,在大約 220 行左右,開啟 Xorg 的所有設定值
  2. 啟動 XRDP,同時讓這個服務永遠都會開機啟動
  3. 使用 netstat 觀察一下 RPD 使用的埠口預設是幾號?
  4. 如果要針對 internet 放行你的 RPD 埠口,該如何處理?

處理完畢之後,你得要注意,未來若有用戶端連線過來,雖然連線是透過 xrdp,但事實上後端跑的依舊是 VNC 喔!這點得要加強說明。 若有其他需要處理的額外設定,也請參考 /etc/xrdp/ 這個目錄下的設定檔吧!

那麼用戶端如何連接?如果是 windows,那就使用遠端桌面連接即可。那如果是 Linux 呢?RockyLinux 9 提供了 freerdp 這個軟體可以提供給你操作使用。 你可以直接使用 yum install freerdp 即可!安裝完畢之後,可以透過底下的指令功能來連結喔:

[student@localhost ~]$ xfreerdp /u:student /v:serverIP

然後最好挑選 Xorg 的原生選項,填入你的 Server 上面的帳號與密碼,就可以登入囉!這這麼簡單!

6.7: 課後練習

  1. (60%)實作題:啟動 Server 作業硬碟 - unit06
    1. 網路參數的設定,請依據底下的方式來設定好你的網路環境:
      1. 因為我們的系統是 clone 來的,因此裡面的網路卡連線會跑掉。所以,請先刪除所有的連線界面後, 再依據底下的要求逐次建立好你的網路環境:
      2. 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.18.255.*/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.18.255.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      3. 使用 teamd 的機制建立內部區域網路的備援功能:
        • team 的界面使用 team0 卡號,且連線名稱請命名為 team0
        • team 使用 activebackup 備援功能,不要使用 loadbalance
        • team 的實體網卡 (team slave) 請使用 ens7 及 ens8 ,且其連線名稱名稱亦請命名為 ens7, ens8
        • team0 網路參數為: 172.19.*.254/24,不需要 gateway
      4. 主機名稱指定為: server*.example.dic
      5. 最終你的主機名稱與 IP 的對應為:
        server*.example.dic	172.18.255.*		別名為 server*
        server254.example.dic	172.18.255.254		別名為 server254
        server.lan*.example.dic	172.19.*.254		別名為 server
        client.lan*.example.dic	172.19.*.1		別名為 client
        
    2. 基本的伺服器作業系統設定行為:
      1. 使用崑山的 FTP 網站作為你的 YUM server 來源,來源倉儲至少需要涵蓋 BaseOS, AppStream, extras 等, 並且清除一次 yum 清單快取。(請注意,由於最終系統會全系統升級一次,升級後,這些設定檔可能會被更新。 因此,你在全部升級完畢之後,還需要回來修改這個設定檔喔!)
      2. 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, wget, bind-utils, kernel
      3. 全系統自動升級,且每天凌晨 3 點也會自動升級一次。(請寫入 /etc/crontab 為主)
      4. 將 SELinux 修改成為 Enforcing 模式,且未來每次開機都自動為 Enforcing 才行
    3. 實際設定好本機防火牆
      1. 請關閉 firewalld 服務,並且自行安裝、啟動 iptables 服務
      2. 將預設的規則轉存到 /root/firewall.sh 這個檔案內
      3. 首先將全部的規則刪除 (應該有三條指令)
      4. 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
      5. 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
      6. 放行你自己的內部區域網路那個網域的連線要求 (針對 LAN 的信任設定)
      7. 讓 ssh 只對外部的區網放行,不會對 Internet 放行 (對 ssh 連線做限制較佳)
      8. 讓 http 針對整個 Internet 放行 (一般公開的服務設計)
      9. 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
      10. 重新啟動 iptables 服務,然後觀察規則是否正確
    4. 實際設定好 Server 的路由功能
      1. 讓核心支援 IP 轉遞的功能,並且每次重新開機都可以自動生效
      2. 修改 /root/firewall.sh ,在該檔案加入清除 nat 表格的規則與自訂鏈的設定
      3. 增加規則:讓來自內部網路的封包,在路由判斷後,並預計由 ens3 對外網卡出去的封包,全部偽裝成為 ens3 的 IP 位址 (一般在數據機上面的就是 public IP)
      4. 在 /etc/sysconfig/iptables-config 當中增加 nf_nat_ftp 及 nf_conntrack_ftp 模組功能
      5. 上述功能在開機後依舊能夠順利啟動
    5. 針對 sshd 服務的相關設定項目:
      1. 由於某些緣故,這個系統的 sshd 必須要同時開啟 port 22 以及 port 3131,且開機完畢就啟動這兩個埠口
      2. 承上,針對 port 3131 的防火牆設定中:
        • 除了兩段區網需要放行之外 (ens3 與 team0 的所在網域)
        • 還需要針對 10.0.0.0/8 放行
        • 但是 10.10.10.0/24 這個區段必須要拒絕使用 port 3131
      3. 建立三個帳號,帳號名稱分別為 localuser1, localuser2, localuser3,三個帳號均加入 nosshgrp 次要群組支援, 這三個帳號的密碼均為 123hehe。此外,這三個帳號可以使用本機 tty1~tty6 登入系統取得 bash 界面,但是不能使用 ssh 遠端登入!
      4. sshd 這個服務拒絕直接以 root 的身份登入系統。
      5. 只給外部網域使用 port 4455 這個埠口轉遞到 port 22 的連線功能,請使用 iptables 防火牆功能來完成這個項目 (請參考 6.3 小節最後面的新增部份)。
    6. 針對異地備份的功能設置(需要在 client 完成網路後才能設定)
      1. 在 server 上面寫一隻名為 /root/bin/backup.sh 的腳本,這個腳本會進行:
        • 以 rsync 透過 ssh 通訊協定,將 Server 上的 /etc, /home, /root, /var/spool/mail 等目錄備份到 client 端的 /backups/ 裡面去
        • 必須要在 Server 上面以 root 的身份進行這個備份的動作,而且備份到 client 時,也是以 root 的身份登入到 client 上面。
        • 進行 ssh 協定時,你被要求需要使用 aes128-gcm@openssh.com 的加密機制。
      2. 上述腳本在運作中,不需要輸入密碼。
      3. 該腳本每日凌晨 2 點進行一次。
    7. 針對圖形界面 VNC 服務的啟動(需要在 client 完成網路後才能設定)
      1. Server 為了圖形界面 VNC,請額外安裝 gnome-session, gnome-classic-session, gnome-terminal 等軟體
      2. 使用 student 的身份建立好 VNC 的服務,且服務密碼為 mystudent,埠口開在 5907 上面。
      3. 在 5901 ~ 5910 這一連續的埠口可以針對 172.30.0.0/16 這一段網域放行。
      4. 每次系統開機都會主動啟動 port 5907 這一段 VNC 服務。
  2. (20%)實作題:啟動 client 作業硬碟
    1. 網路參數的設定,請依據底下的方式來設定好:
      1. 因為我們的系統是 clone 來的,因此裡面的網路卡連線會跑掉。所以,請先刪除所有的連線界面後, 再依據底下的要求逐次建立好你的網路環境:
      2. 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.19.*.1/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.19.*.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      3. 主機名稱指定為: client.lan*.example.dic
      4. 最終你的主機名稱與 IP 的對應為:
        server*.example.dic	172.18.255.*		別名為 server*
        server254.example.dic	172.18.255.254		別名為 server254
        server.lan*.example.dic	172.19.*.254		別名為 server
        client.lan*.example.dic	172.19.*.1		別名為 client
        
    2. 實際設定好本機防火牆
      1. 預設請使用 firewalld 防火牆服務,不要使用 iptables 服務!
      2. 請將預設的領域 (zone) 改為 work 領域
      3. 預計放行的服務主要有 ssh 與 http 兩個服務,其他還可能有預設會啟用的 dhcp 用戶端服務。
      4. 查詢 rich rule (man firewalld.richlanguage),確認來自本機同一個 LAN 網段的封包,通通給予放行。
      5. 上述放行的防火牆服務,在下次重新開機後,依舊會存在才行
    3. 使用特別的設定方式來處理無法使用 root 登入卻需要 root 權限的行為
      1. 在 Server 上面建立一個名為 admin 的帳號,該帳號的密碼請設定為 345haha。這個帳號使用 sudo 時,不需要輸入密碼即可放行。
      2. 在 Client 上面建立一隻名為 /home/student/bin/getroot.sh 的腳本,腳本的基本內容如下(請修改 ip 為正確的 server IP):
        #!/bin/bash
        
        ip="Your server IP"
        ssh -o StrictHostKeyChecking=no admin@${ip} "LANG=en_US; sudo sh -c \"
        	ls -l /root;
        	whoami
        	\"
        "
        
      3. 這隻腳本可以讓 student 執行,且 student 執行時,無須輸入任何密碼就可以取得 Server 的相關 root 權限資料。
  3. (20%)簡易問答題 (前面 7 題 2 分,最後一題 6 分。) 從具有 GUI 及中文的用戶端 Linux ,使用『 ssh root@172.19.*.254 』登入你的 Server ,之後建立 /root/ans.txt 的檔案,並將底下各題目的答案寫入你 server 當中!
    1. 成對的金鑰系統有公鑰與私鑰,請問,(1)那一把鑰匙在加密?(2)那一把鑰匙在解密?(3)那一把鑰匙是不能流出去的?
    2. 以本機的 localuser 帳號為例,當有任何 ssh 公鑰被紀錄時,預設紀錄的檔名為何?
    3. 預設的 ssh 的 version 2 (1)使用那一個加密機制?(2)如何觀察目前硬體有沒有支援該機制?
    4. 若想要使用 ssh -X 來登入遠端主機取得圖形界面軟體的使用權時,遠端伺服器應該要安裝哪個驗證軟體才行?
    5. 以本機的 localuser 帳號為例,這個帳號設定好 VNC 的使用後,預設 VNC 連線密碼記載檔名為何?
    6. 承上,那麼啟動 VNC 的程序運作檔名為何?
    7. RDP 預設的埠口號碼是幾號?
    8. 考慮如何以 ssh 加密某個服務的連線,底下是相關運作的環境介紹:
      • 我的 Server IP 為 myserverip,在 Server 上面有個服務啟動到 port 7777,這個 Server 的服務本身並沒有加密。
      • 我的 Server 上面有個我能夠掌握的帳號,帳號為 myserveruser
      • 我在 client 端想要啟動一個 port 4433 ,當我使用類似 vncviewer localhost:4433 時,該連線可以連接到 myserverip 的 port 7777。
      寫下來,(1)你要在 client 端還是 server 端執行 ssh 指令? (2)指令如何下達?
  4. 上傳成績
    1. 請將 Server/Client 的硬碟通通啟動,並且確認兩者間的連線沒有問題;
    2. 在 Server 硬碟上面登入,然後用 root 的身份執行 vbird_server_check_unit ,並依據提示資料填寫你的學號與 IP 尾數
    3. 該程式會偵測你的系統,並且通知你哪個部份可能有問題,你需要持續觀察或者重新處理的部份會交代妥當。
    4. 若一切沒問題,螢幕就會出現如下的字樣,然後你就能夠使用 links 去檢查你的檔案是否有順利的上傳了!
    5. Please use links http://172.18.255.250/upload/unit06 to check your filename

  • 2020/11/05:修改一些文字的錯誤,同時增加 6.3 小節的部份新增功能,另外,也將作業習題搞定!請大家實做看看!
  • 2022/10/09:在 RHEL 9 之後, xorg-x11-apps 已經被丟棄,因此沒有 xeyes, xclock 等指令,只好使用 xterm 來取代!
  • 2022/10/10:將硬碟也處理完畢。