Linux伺服器 Linux伺服器

網站伺服器建置與管理 - CentOS 8

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

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

上次更新日期 2020/11/05

較有規模的公司,伺服器都是放在機房的。至於像校園系所的伺服器,或老師個人的伺服器,可能就只是放在某個角落沒有接上螢幕的主機而已。 因此,要登入這些設備,就得要透過網路連接到系統裡面去。連接到伺服器的方法有純文字模式與圖形界面模式, 純文字模式幾乎一定是用 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: 遠端連線伺服器與連線加密的金鑰系統

  • 什麼是遠端連線伺服器

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

  • 透過純文字模式,目前主流為 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 去查詢支援度),而不是使用預設的機制。 如果要強迫使用 aes256-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. 在伺服器端的軟體:
    • 先安裝比較多軟體的 xorg-x11-apps 這個軟體包;
    • 因為需要提供操作者的驗證,因此還需要安裝 xauth 這個軟體包
  2. 在用戶端 GUI 的環境下,執行:『 ssh -X account@IP xeyes 』等,來執行伺服器端的 X client 軟體。 未來若有其他需求,直接修改 xeyes 成為你要執行的軟體即可!

進行上述練習時,在 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. 在 Client 用 root 帳號身份,將 /root, /etc 目錄備份到 Server 的 student 家目錄下的 backups 目錄中
  2. 重複上一個動作,結果會如何?
  3. 如果需要使用到 port 5533 時,又該如何下達指令?
  4. 定期於每日 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 -c -v -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 伺服器

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

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

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

例題 6.6.A:啟動與觀察 XRDP 伺服器
  1. 啟動 XRDP,同時讓這個服務永遠都會開機啟動
  2. 使用 netstat 觀察一下 RPD 使用的埠口預設是幾號?
  3. 如果要針對 internet 放行你的 RPD 埠口,該如何處理?

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

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

[student@localhost ~]$ xfreerdp serverIP:port

然後最好挑選 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, PowerTools 等, 並且清除一次 yum 清單快取。(請注意,由於最終系統會全系統升級一次,升級後,這些設定檔可能會被更新。 因此,你在全部升級完畢之後,還需要回來修改這個設定檔喔!)
      2. 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, mailx, wget, links, bind-utils, kernel-tools, kernel-modules (某些軟體可能需要使用 PowerTools 軟體倉儲安裝喔!但是該軟體倉儲預設需要是不啟用
      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. 針對異地備份的功能設置
      1. 在 server 上面寫一隻名為 /root/bin/backup.sh 的腳本,這個腳本會進行:
        • 以 rsync 透過 ssh 通訊協定,將 Server 上的 /etc, /home, /root, /var/spool/mail 等目錄備份到 client 端的 /backups/ 裡面去
        • 必須要在 Server 上面以 root 的身份進行這個備份的動作,而且備份到 client 時,也是以 root 的身份登入到 client 上面。
        • 進行 ssh 協定時,需要使用 chacha20-poly1305@openssh.com 的加密機制,加快傳輸速度。
      2. 上述腳本在運作中,不需要輸入密碼。
      3. 該腳本每日凌晨 3 點進行一次。
    7. 針對圖形界面 VNC 服務的啟動
      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 小節的部份新增功能,另外,也將作業習題搞定!請大家實做看看!