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