升級編譯 sshd 8.0 並移除版本資訊

OpenSSH 8.0 在最近發佈了

並修正影響了35年的scp安全性bug(https://www.openssh.com/releasenotes.html)

但是CentOS是出了名的更新緩慢

要更新就是要自己編譯source code

這次記錄下升級的過程與遇到問題的解決方法

下載原始碼

尋找適合自己的 mirror

https://www.openssh.com/portable.html#http

我是選 cloudflare

利用wget指令下載到server上並解壓縮

$ wget https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz
$ tar zxvf openssh-8.0p1.tar.gz
$ cd openssh-8.0p1

安裝相依套件

如果沒有裝編譯套件則需要先安裝

$ yum group install 'Development Tools'

還要安裝OpenSSH必要的套件

$ yum install zlib-devel openssl-devel

再來CentOS上不能關閉PAM所以先安裝PAM的dev package

$ yum install pam-devel

而我的Server是開啟SELinux的,所以一起裝上去

$ yum install libselinux-devel

查看與決定編譯參數

相依套件都裝完之後

可以用./configure —-help來查看所有支援的編譯參數

我只選了PAM跟SELinux

其餘套件與路徑都未變動

這樣才不會覆蓋掉系統原本的sshd

$ ./configure --with-pam --with-selinux

移除版本資訊

這一步驟就看個人了

我比較不喜歡被發現各個服務的版本是多少

只需要在編譯之前

修改 version.h裡面的SSH_VERSION即可

#define SSH_VERSION "XXXXXXX"

編譯

最後下make就可以

$ make
$ make install

預設是安裝在/usr/local/sbin/sshd

修改Systemd

先查看sshd.service放在哪個路徑

$ systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) 
   .....
   .....

可以在輸出的訊息中發現service檔案在/usr/lib/systemd/system/sshd.service

利用vim編輯

將ExecStart路徑改為/usr/local/sbin/sshd

並利用-f參數手動指定config路徑

最後修改為

ExecStart=/usr/local/sbin/sshd -f /etc/ssh/sshd_config -D $OPTIONS

最後要reload

$ systemctl daemon-reload

設定SELinux

新編譯好的binary selinux權限是不正確的

$ ls -Z sshd
-rwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 sshd

若要設為正確可參考原始的sshd

$ ls -Z /usr/sbin/sshd
-rwxr-xr-x. root root system_u:object_r:sshd_exec_t:s0 /usr/sbin/sshd

或是直接用參考的方式複製相同的selinux權限到新的執行檔

$ chcon --reference /usr/sbin/sshd /usr/local/sbin/sshd

重啟sshd

依據經驗

就算重開sshd service

已經連上的ssh connection並不會中斷

但以防萬一

還是要有可以連上console的方式

像是可以在機器前操作

Linode則有提供Lish等方式

若一切就緒

就直接restart吧!

$ systemctl restart sshd

若是遇上timeout問題

sshd.service start operation timed out. Terminating.

則要修改systemd的Type

將原本的 Type=notify 改為 Type=simple

看更多