安裝 OpenSSH Server

No Comments

安裝與使用 OpenSSH 的文章很多且制式,筆者就偷懶省略。

重點是同樣要做撥接寬頻/主機/ VM 的埠轉發設定。
之前在 web server 設置的時候因為 80/443 ports VM 無法存取到,故會在主機上做一次 port forwarding(即 80 到 1025)。而當前使用 SSH,筆者就直接取用 5902 port 而非慣例的 22 port。如此,對外的 5902 port,撥接寬頻,一直到主機上,就只要打通這個通道。而 VM 就是做一次 5902 port 到 VM 內的 22 port 的轉接。

本機:毌需設定,只要 ufw 打開 5902 port 即可。
VM:port forwarding 設成 5902 < — > 22

因此,在外地遠端要 SSH 到本機的 VM 的指令下法:ssh -p 5902 user@waterfalls.ddns.net

  • 參考資料
  • https://shazi.info/%E7%94%A8-ssh-tunnel-%E4%BE%86%E9%81%BF%E5%85%8D%E9%98%B2%E7%81%AB%E7%89%86%E9%98%BB%E6%93%8B%E5%AF%A6%E4%BD%9C%E8%88%87%E5%8F%8D%E5%88%B6/
  • https://netsec.ws/?p=287
  • https://www.systutorials.com/243000/port-forwarding-on-local-host/
  • https://www.cyberciti.biz/faq/create-ssh-config-file-on-linux-unix/
  • https://linuxconfig.org/most-common-custom-ssh-configurations-of-the-openssh-server
  • https://superuser.com/questions/718346/openssh-ssh-config-host-specific-overrides-not-working
  • https://blog.swmansion.com/limiting-failed-ssh-login-attempts-with-fail2ban-7da15a2313b

筆者還是追加了一下:

  • 搜尋安裝 ssh-server。
  • SSH 連線,有兩種方式,一種是使用帳密;另一種是使用公(私)鑰,於此我們簡稱 pub key。
  • 首次連線的話,是一定要使用到密碼的,除非,對方已存有我的公鑰才不用。當然後續也可以不使用 pub key 而一直都用帳密做登錄。
  • 若想使用 pub key,我們就必須産生一組(私鑰/公鑰)。其中私鑰是自己用來編解碼用的。而公鑰就是傳給對方保留著並代表者我已列入進入他家門的允許訪客名單中了(對方用來編解碼用的)。産生公私鑰:
  • ssh-keygen
  • 預設會在 ~/.ssh/ 下産生 id_rsa 私鑰和公鑰 id_rsa.pub
  • 那麼我們首次連線就可以這樣做,複製公鑰到對方主機內:
  • ssh-copy-id -p 5902 $user@$hostname
  • 其中 $user 是欲以對方哪位使用者做登入。$hostname 是對方主機。從 5902 埠登入。
  • 預設 port 22 的話就不用指明 -p 參數。
  • 當然這一次是需要密碼通行的。
  • 接著,若上一步成功的話,就可以直接下這一行,不用密碼便可登入到主機了:
  • ssh -p 5902 $user@$hostname
  • 而本地端的 public key,便由遠端收藏到 authorized_keys 檔案內。故查看主機上的此檔內容可獲知主機已核可哪些用戶端可 ssh 進來。
  • 若不想登入主機,只想複製檔案 a.txt 到該主機的,取名為 /home/ken/myfile.conf:(port 參數要用大寫 -P)
  • scp -P 5902 a.txt $user@$hostname:/home/ken/myfile.conf
  • 若路徑或檔名有空格,例如 abc def.g 請使用 “abc\ def.g”
  • scp 的常用法,加 -p 保留檔案屬性。加參數 -r 做重覆傳輸/整個(子)資料夾;但來源最好要加星號,例如最好是使用“./*”而非“./”。既存的檔案會被覆蓋。
  • 壓縮 scp -C a@b:bigfile
  • -l Limits the used bandwidth, specified in Kbit/s
  • 降低安全性加快速度 -c blowfish

筆者又再追加一個,SFTP Server

  • 在之前,筆者安裝了 vsftp server,但之後啟用了 ufw 防火牆,使得 vsftp 被防火牆擋住了。解決的方法是修改防火牆規則;其屬進階,筆者目前也不懂。其二是 ftp 不使用 passive mode;此無普適性。因此,這留待以後較懂防火牆後再來著手。
  • 所幸 OpenSSH 也有提供內建的 secure ftp,那麼我們就來啟用它。
  • 筆者將在之前建立 vsftp server 的基礎上配置 secure ftp server。
  • 之前為 vsftp 而已建立的其中之一使用者 ftp_wp 我們就拿他來做例子。
  • 此外,我們意欲使用者 ftp_wp 無法以 secure shell 的方式遊走在我們的檔案系統中,並且 sftp 登入後,也是受到限制,故必須耍些手段限制使用者的活動範圍。
  • 還有,本文只是做補充,有些重要的設定這邊就可順帶提及。我們從 ssh server 的設定來開始:
  • 設定檔 /etc/ssh/sshd_config
  • 欲使用哪些 ports,我們須明白指定,例如開啟 port 22,port 5902,我們就追加這兩行
  • Port 22
  • Port 5902
  • 欲限制哪些使用者能不能登入,例如 ken 可以登入,root 不能登入
  • AllowUsers ken
  • DenyUsers root
  • 接著我們就來設定 sftp 的部份:
  • 我們追加以下這一段落;
  • 請注意:
  • 一。最後一行,是使用 chroot 後的路徑,所以不要指定成絕對路徑。
  • 二。一開頭使用了 Match group ftps,代表在 ftps 群內的所有使用者都將會影響到。這也表示了,只要在 ftps 群內的使用者就只能使用 sftp 了,加上了次一行,那麼除了 ftp_wp 其他人也都不能使用 sftp。換言之,假設管理員也在 ftps 群內,那麼,照底下的設定,他將無法再 sftp or ssh 進入系統了,不得不小心。
  • 三。因此,通常我們可以設定成只要一行 Match User ftp_wp,那麼,也只有此使用者受到限制(只能使用 sftp)。不過還需注意,接著下 AllowUsers ftp_wp 仍是必要的。
  • 四。筆者已遇到,安裝新版的 sshserver,舊版的 client 無法 sftp 進去,如下錯誤,
    sshd[163437]: userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
    大概的意思是,舊版的 AuthAlgo 有弱點已拿掉不再支援,要嘛舊版中使用新的編碼演算法;要嘛在此 sshserver 啟用 ssh-rsa,如下在 sshd_config 內追加這行。
    PubkeyAcceptedAlgorithms=+ssh-rsa
    參考資料,一定得去看一下,
    https://askubuntu.com/questions/1409105/ubuntu-22-04-ssh-the-rsa-key-isnt-working-since-upgrading-from-20-04
# 找到 Subsystem 開頭的這一行,並須將它改成以下這一行
Subsystem       sftp    internal-sftp

# 追加下面這一段落
Match group ftps
        AllowUsers ftp_wp
        ChrootDirectory /home/allftpusers/%u
        PermitTunnel no
        AllowAgentForwarding no
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp -d uploads

我們之前已經建立了 ftps 群組,規劃其成員的 home dir 在 /home/allftpusers/$every_body/底下。但那是屬於 vsftpd 的設定。因此於此一樣,我們將限制任何人都只能在 $every_body/ 及其子目錄底下活動;這代表著 $every_body/ 這個目錄就是每一個人的 root,亦即上面設定中的 ChrootDirectory 的指定,%u 代表 user 的名稱。
目前只允許一位群組中的成員 ftp_wp 能夠使用 sftp,若要追加其他人就在 AllowUsers 這一行加。
再來最重要的是,openssh 規範 chroot 的根目錄/家目錄必須擁有者是 root,且群組及其他人不可寫。照之前 vsftp 文中的設定,我們此將會(只需)把擁有者 ftp_wp 改成 root,且下 go-w 的權限設定。另外將登入後的路徑導到使用者可存取的 uploads 下,如上段落最後一行。

  • sudo chown root /home/allftpusers/ftp_wp
  • sudo chmod go-w /home/allftpusers/ftp_wp
  • sudo systemctl restart sshd.service

要登入 sftp 只要下 sftp -P 5902 ftp_wp@waterfalls.ddns.net


當然,還有最後一步,我們希望不用密碼登入,故主機必須還要先幫我們建立 .ssh 的資料夾及可存取的金鑰認證檔 authorized_keys,屆時 sshd 會去該處查 key。
因此,
sudo mkdir /home/allftpusers/ftp_wp/.ssh
sudo touch /home/allftpusers/ftp_wp/.ssh/authorized_keys
sudo chown ftp_wp /home/allftpusers/ftp_wp/.ssh/authorized_keys
sudo chmod 600 /home/allftpusers/ftp_wp/.ssh/authorized_keys


接著,在我們本地端切換到 $home/.ssh/ 目錄下找到 id_rsa.pub 這個檔案,準備上傳上去:
本地端一樣先以 sftp -P 5902 ftp_wp@waterfalls.ddns.net 做登入,
在 sftp> 提示符號下下達
sftp> put id_rsa.pub /.ssh/authorized_keys
接著登出重新登入即可不用輸入密碼。

至此,會有一個疑問須澄清,我們曾經做過處置的(指的是在 vsftp 那篇文章中的設定)以讓 user ftp_wp 只能作 sftp 而無法 ssh 登入。而事實上就 sshd 而言是可以省略的,亦即,應當這樣說:
ssh 及附設的 sftp,預設行為是任何一位使用者皆可使用;既可 ssh 登入,亦可 sftp。因此,我們上述後半段的 sftp 設定,純粹讓使用者無法再能 ssh 登入,而僅能使用 sftp(被 chroot)。況且,一旦 chroot,表示原始的任何例如執行路徑都變更掉了故理所當然只剩 sftp 檔案收送功能了。當然,之前的限制使用者的那些設定,有固然更好。因此依據 sshd 的邏輯,將 users 分為兩類;可使用 ssh & sftp 者,及只能使用 sftp 者。

另外又想到了,我們本地端機器以遠端機器中的 ftp_wp 使用者做登入,使用的是本地端的一對金鑰。萬一在他處/他台機器也想要能夠 ftp_wp 登入,就必需使用那台機器産生出來的一對金鑰。這表示上式的做法只適用於初次。通用做法應是先將 key 下載回來,追加當前機器的公鑰上去後,再上傳回去:
sftp -P 5902 ftp_wp@waterfalls.ddns.net
sftp> get /.ssh/authorized_keys ./the_machine
接著 exit 登出。若找不到該檔(或大小零),便表示是初次。用上述做法即成。再接著,
cat id_rsa.pub >> the_machine
sftp -P 5902 ftp_wp@waterfalls.ddns.net
sftp> put the_machine /.ssh/authorized_keys

另外還又想到,authorized_keys 的權限是使用者可讀寫,若該帳號為多人使用,那有可能不當操作就破壞了 authorized_keys 造成所有人都無法登入(但仍能用密碼)。所以原則就是,一個帳號一人多台機器可用。多人就建多個帳號。
本文,請參佐前文:https://waterfalls.ddns.net/2019/12/14/架個-ftp-伺服器-vsftpd/

再一個額外的說明:
私鑰與公鑰是成對使用的。任何一個本地端使用者例如 ken,預設下,只有以一對來使用,其放置在 $home/.ssh 下且名稱是 id_rsa 和 id_rsa.pub。
然而 ken 可以擁有不止一對,可以用不同的 key 胚來應付不同的主機以提高安全性。所以可以再以 ssh-keygen 來産生新的一對 keys。但這時就要指定不同的路徑或名稱來存放,並且其目的是要使用在另某一台主機。因此,接續我們就可在 /etc/ssh/ssh_config 檔案中設定我們本地 client 端的對外連線資訊,其包含了取哪對 keys 來用在哪台遠端連線。細節可用 “ssh client ssh_config tutorial” 關鍵字來搜尋如何去做設定。
https://www.digitalocean.com/community/tutorials/how-to-configure-custom-connection-options-for-your-ssh-client

  • 根據此篇文章的教學,簡單整理如下。
  • 在 /etc/ssh/ 中,有一組優先權最高的通用設定,其將首先被讀取。一旦有參數被設定,其後若再被設定則不會變更。
  • 以下就 openssh client 論。
  • 使用者的設定則放置於 ./some_user/.ssh/ 底下,檔名 config。
  • config 內,關於參數的設定,是逐行由上而下讀取,一旦有參數被設定,若接續還被設定,將不會變更。故,一般原則是通用的設定放在較後面,而較專用特定相依的設定則放在較前面;
  • Host 關鍵字用以區隔各種不同連線或分立的設定。其後的識別子,可是主機或 IP,例如 home.example.com,*.example.com,192.168.1.10,192.168.10.*。或別名,例如,my_home_server。openssh 將逐一套用符合識別子的那些設定。而別名將代表著該設定區塊內的 HostName/User/Port 的可能組合。command line 具有最高優先權以䨱寫某些可被覆寫的參數(這句話待查證);例如,
    Host my_home_server
    HostName home.example.com
    User kenny
    Port 50
    則,
    > ssh my_home_server 將是 ssh -p 50 kenny@home.example.com
    > ssh ken@my_home_server,將是 ssh -p 50 ken@home.example.com
  • Host 內另外兩個常用參數
    IdentityFile path_to_the_key_file
    IdentitiesOnly yes or no。指定 key file 由 IdentityFile 所指定限定;若 key 不符,不再查找其他預設路徑檔案。
  • Client 方面,若連線上會有大部份時間閒置著,將很可能被斷線,故可試著 keep alive,此加在最前頭或使用特定指明的 servers。
    Host *
    ServerAliveInterval 120

    不過,也可在 host 端加,
    ClientAliveInterval 120,

    又或是在連線時,直接下 option 的參數 -o ServerAliveInterval=120


新增補充:
在後面的文章,“安裝 QEMU/KVM/Docker”,補充了 ssh 的 R/L tunnel 和 autossh。
其將遠端登入實現得淋漓盡致,讓我們無阻放心地運用之。例如某台區網內的電腦(或直截了當說,手機)可因之而成被公開存取的電腦而不使用連續的 port-forwarding(手機也無法做 port forwarding;因此它讓不可能變為可能),取而代之的是簡捷地 ssh-tunnel。
啥,不夠?
那就再加一行,懂的便懂,不過此 utility 已沒有在積極 active 了;當然這也是 open source 的天生缺陷:
sudo sshfs -o allow_other,IdentityFile=/$somewhere/id_rsa -p $someport user@hostname:/mount-point-source/ /local-target-mount-point/

其將遠端的 mount-point-source mount 回來本地端。欲將其解除,除了下指令的終端退出外,也要 sudo umount 該 mount-point。
記得皆需使用 sudo 才能成功。
另外,來源磁碟中的軟連結是無效的,所以若需要,須 mount 到實際的檔案位置。

Categories: Linux 架設網站

Tags: ,

PHP Code Snippets Powered By : XYZScripts.com