用 ssh 遙控你在遠方的阿凡達替身

阿凡達替身醒來 阿凡達電影當中, 地球人到了水土不服、 空氣組成不同於地球的潘朵拉星。 於是他們透過一個人造的模擬納美人軀體, 讓科學家與戰士可以躲在實驗室裡用思想遙控他自己的 avatar (阿凡達替身), 在潘朵拉星上不必使用氧氣面罩就可以自由活動。 使用 ssh 遠端連線, 意思很類似, 只不過你根本就可以從地球遠端遙控那個遠在潘朵拉星的你的阿凡達替身, 甚至不必親自進駐潘朵拉星的實驗室。 假設有人在潘朵拉星的一部主機 farm.pandora 上幫地球上的朋友開一個 ssh 帳戶叫做 avatar, 那麼遠在地球上的他, 就可以打指令: ssh -X avatar@farm.pandora 連線到 farm.pandora 開操作他的阿凡達替身 avatar, 在那一部潘朵拉星的電腦上做事。

以下的動作假設一位同學在 farm.pandora 上面扮演替身農場的主人, 建立一個名為 avatar 的阿凡達替身, 並啟動 sshd 提供服務; 另一位同學從 lab.earth 用 ssh 遠端登入 farm.pandora。 每一位同學都可造訪好幾個遠端的農場, 遙控不同農場上的阿凡達替身, 所以這個實驗並不一定要兩人一組; 只要確認你扮演農場主人時, 有同學扮演地球人造訪/協助測試就可以了。

注意: 啟動 sshd 服務, 讓別人可以從遠端登入你的機器, 有極高的資訊安全風險。 實際應用時, 建議只開放給好朋友進入; 實驗結束後, 盡快關掉 sshd 服務。

文字模式的連線

  1. [農場主人] 幫地球人建立一個阿凡達替身: sudo useradd -m -s /bin/bash avatar (可以用自己任意挑選的別的名字取代 avatar) 並且幫他改密碼: passwd avatar
  2. [農場主人] 變身成阿凡達: sudo su avatar, 然後用阿凡達的身份:
    1. whoami 確認已變身成 avatar。
    2. 編輯 ~/.nanorc , 加上 set constset softwrap 兩句。 詳見 文字檔案編輯器 nano
    3. 用 nano 或 geany 編輯 ~/.bashrc , 在裡面找到這一段, 或補上這一段:
      if [ "0" -eq "$EUID" ] ; then
          PS1='\[\033[01;31;40m\]\u@\h\[\033[00m\]:\[\033[01;35;40m\]\w\[\033[00m\] \$ '
      else
          PS1='\[\033[01;32;40m\]\u@\h\[\033[00m\]:\[\033[01;35;40m\]\w\[\033[00m\] \$ '
      fi
      
      上半句說: 如果我變身成 root , 就用某種套色; 下半句說: 如果不是用 root 的身份, 就用另一種套色。 其中 31 表示前景用 1 號顏色、 40 表示背景用 0 號顏色。 3 跟 4 是固定不變的; 後面的顏色代號只有 0~7 可用。 詳見 ansi escape color codesBash prompt PS1 設定 與產生器Change The Color of Shell Prompt。 總之就是要讓你的 command prompt string 命令提示字串 跟別人的看起來不一樣。
    4. 按 ctrl-d 跳脫阿凡達的身份、 打 whoami 確認自己已變身回 root。
  3. [農場主人] 查看自己的數字 ip: ifconfig -a | grep 192 並抄給地球人。 (假設你在電腦教室裡使用 192.168 的 class C 私有 ip) 以下凡是出現 farm.pandora 的地方, 請都改成你真實的數字 ip。
  4. [地球人] 嘗試登入: ssh -X avatar@farm.pandora 應該會看到 ssh: connect to host farm.pandora port 22: Connection refused 表示農場還沒開張。 如果成功或被問到是否確定要連線, 那表示農場已開張 -- 請直接跳到 「再次嘗試登入」 那一步。
  5. [農場主人] 檢查是否已啟動阿凡達替身農場服務: ps ax | grep sshd 如果剛剛地球人連線失敗的話, 表示農場主人現在應該只看到 grep 自己, 類似這樣: 9618 pts/3 S+ 0:00 grep sshd 或是用 systemctl status ssh 會看到 inactive (dead)
  6. [農場主人] 搭建阿凡達替身農場 (安裝套件): apt-get install openssh-server
  7. [農場主人] 因為 ssh 服務超級強大, 很容易成為潰客攻擊目標, 所以我們先設定它每次重開機時 不要 自動啟動: systemctl disable sshd 。 等你學會 用 fail2ban 保護自己 之後, 再考慮用 systemctl enable sshd 改成 「開機時自動啟動」。
  8. [農場主人] 上面 「安裝套件」 那一步做完之後, 應該就會自動啟動阿凡達替身農場服務。 請用 ps ax | grep sshd 再檢查一次, 應多出一列類似這樣: 9318 ? Ss 0:00 /usr/sbin/sshd 或是用 systemctl status ssh 會看到 active (running)
  9. [農場主人] 如果沒看到 /usr/sbin/sshd 的話, 請手動啟動農場服務: systemctl start ssh
  10. [地球人] 再次嘗試登入: ssh -X avatar@farm.pandora 這次應該看到類似以下:
            The authenticity of host 'farm.pandora (192.168.1.99)' can't be established.
            RSA key fingerprint is ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff.
            Are you sure you want to continue connecting (yes/no)?
            
    
    打 yes 確認之後, 就會被問密碼。
  11. [農場主人] 檢查有誰正在使用我的電腦: who 應該沒有任何一列顯示 avatar。
  12. [地球人] 再次嘗試登入: ssh avatar@farm.pandora 回答完密碼之後, 成功登入遠方!
  13. [農場主人] 再次下 who 這次應該出現一列類似以下:
            avatar   pts/2        2011-04-06 09:05 (lab.earth)
            
    
    表示已有一位來自地球 (lab.earth) 的用戶, 從遠端登入本地操作名為 avatar 的阿凡達替身。
  14. [地球人] 另外開一個終端機分頁, 下 who 指令, 在這裡看到的是 自己的機器被使用的狀況。
  15. [地球人] 再回到遠端登入的終端機分頁, 同樣下 who 指令, 這裡看到的內容則應該和農場主人一樣。 這個分頁就像是透過阿凡達替身的眼睛所看到的一樣, 週遭盡是 farm.pandora 景象。
  16. [地球人] 按 ctrl-d 結束連線。
  17. [農場主人] 檢查最近誰曾經使用我的電腦: last

圖形模式的連線

但是遠端登入後, 只有文字界面, 就太無趣了。 以下的實驗假設開設替身農場的潘朵拉星電腦上安裝有 gnuplot, 我們要把潘朵拉星上面打開的圖形視窗丟回地球來。

  1. [地球人] 開一個本地端的終端機分頁, 玩一下 gnuplot 十分鐘的 3d 曲面奇航
  2. [地球人] 在潘朵拉星的分頁裡, 也執行 gnuplot 並下指令畫圖。 現在出現的圖, 是在潘朵拉星上畫好、 再傳回地球的。 也就是說, 如果潘朵拉星上面安裝了某些地球上沒有的圖形介面軟體, 那麼你還是可以透過這個方式從遠端使用它。 不過因為透過網路, 可能會有點 lag。
  3. 如果失敗, 看到如下訊息:
            gnuplot: unable to open display ''
            gnuplot: X11 aborted.
    
    那麼有幾個可能的原因。 如果是地球人當初在命令列上忘了打 -X , 那就要按 ctrl-d 登出、 按 ctrl-d 離開 gnuplot、 再按一次 ctrl-d 離開潘朵拉星。 請用 whoami 指令確認你不是 root 而是普通人。 如果是 root, 請再按一次 ctrl-d 退出。 最後, 重下一次 ssh -X ... 連線指令。 這個 -X 叫做 X Forwading
  4. 另一個可能是因為潘朵拉星還沒有開放 X Forwarding 服務。 農場主人請 nano /etc/ssh sshd_config。 (另有一個 ssh_config 設定檔與我們無關, 注意不要打錯檔名。) 找到一列含有 "X11Forwarding" 字串。 如果後面是 no, 就改成 yes; 如果前面有 "#" 號, 就拿掉。 那一句話最後變成: X11Forwarding yes 另外加一句 X11UseLocalhost no。 詳見 ssh X forwarding 失敗除錯
  5. [農場主人] 重新啟動農場服務: systemctl status ssh (或者先 stop 再 start 也一樣。) 每次改完設定檔都要這樣做, 新的設定才會生效
  6. [地球人] 重新連線, 這次啟動 「傳送圖形界面」 功能: ssh -X avatar@farm.pandora 然後 進入 gnuplot, 應該會看到農場主人先前為他的 avatar 所畫的圖, 現在在本地機上出現, 並可用滑鼠操作。

其實如果不考慮 web 2.0 共筆現象, 那麼 ssh -X 早就已經是最完整、 最不需要改變任何使用習慣的零成本 雲端運算, 因為所有既有的桌面應用軟體都可透過 ssh -X 從雲端的主機分享給遠端的用戶。

非對稱式加解密

白話 「非對稱式加密/解密」 Asymmetric Cryptography

ssh 的信任機制

定期排程異地備份不需要密碼, 就交給 ssh 的信任機制與身份識別吧!

信任機制實驗

  1. [農場主人] 先關閉農場服務: systemctl stop ssh
  2. [地球人] 嘗試登入, 失敗: ssh -X ...
  3. [地球人] 把 ~/.ssh/id_rsa.pub (用隨身碟或用 e-mail) 分享給農場主人。
  4. [農場主人] (用普通人的身份!) 把地球人的 id_rsa.pub 剪貼到自己的 authorized_keys 裡面去: cat ~/id_rsa.pub >> /home/stux/.ssh/authorized_keys
  5. [農場主人] 編輯 /etc/ssh/sshd_config , 在裡面修改或加上這一句: PasswordAuthentication no
  6. [農場主人] 重新啟動 ssh: systemctl restart ssh
  7. [地球人] 再次嘗試登入, 成功!
  8. [壞人] 嘗試登入, 失敗!

可怕的警告訊息

有時候用 ssh 連線時會看到類似這樣的可怕訊息:

        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        ...
        Offending key in /home/ckhung/.ssh/known_hosts:8
        RSA host key for farm.pandora has changed and you have requested strict checking.
        Host key verification failed.

這有可能是因為農場主人把農場砍掉重練 -- 例如重灌作業系統之類的。

請到 /etc/ssh 底下查看這些檔案: ssh_host_*key* 。 這裡就是一對一對的公鑰加私鑰, 就像是這部伺服器的指紋、 代表著這部伺服器的身份。 農場主人在重灌作業系統之前, 應該先把這些檔案備份起來。 灌好之後, 再把這些舊的檔案放進新的伺服器, 這樣地球人在連線時才會看到同一部伺服器。 如果忘記這麼做, 地球人那頭的 ssh 會以為有人假冒農場主人 (因為 key 改變了), 所以拒絕連線並提出警告。

如果你的機器並不是重要的伺服器, 只是電腦教室上課用的實驗機, 那麼也可以這樣手動製造重灌的效果: 把這些檔案都刪了: rm ssh_host_*key* [不要在伺服器上這樣做!!] 然後 dpkg-reconfigure openssh-server 重新產生新的金鑰。 這樣別人下次要連線時, 就會被嚇到。

更安全的 ssh 設定

設定密不透水的 ssh 服務