安装依赖
apt -y install gcc g++ make openssl libssl-dev libpam0g-dev
# ubuntu上的zlib1g zlib1g-dev就相当于centos上的zlib和zlib-devel
# 这里之所以没有安装 zlib,是因为apt安装的zlib在编译安装openssh时并不可用,会报错:
checking zlib.h usability... no checking zlib.h presence... yes configure: WARNING: zlib.h: present but cannot be compiled configure: WARNING: zlib.h: ? ? check for missing prerequisite headers? configure: WARNING: zlib.h: see the Autoconf documentation configure: WARNING: zlib.h: ? ? section "Present But Cannot Be Compiled" configure: WARNING: zlib.h: proceeding with the compiler's result configure: WARNING: ? ? ## ------------------------------------------- ## configure: WARNING: ? ? ## Report this to openssh-unix-dev@mindrot.org ## configure: WARNING: ? ? ## ------------------------------------------- ## checking for zlib.h... no configure: error: *** zlib.h missing - please install first or check config.log ***
编译安装zlib
# 截至2022年5月,最新的zlib是zlib-1.2.12,可以登录到官网查看自己需要的版本
# 编译openssh时需要指定zlib位置:--with-zlib=/usr/local/zlib
wget http://www.zlib.net/zlib-1.2.12.tar.gz
tar zxvf zlib-1.2.12.tar.gz
cd zlib-1.2.12/
./configure --prefix=/usr/local/zlib
sudo make && make install
编译安装OpenSSL
目前,openssl被维护了两个版本1.1.1和3.0。这里,选择1.1.1o
- 注意: 最新的稳定版本是3.0系列。1.1.1系列是我们的长期支持(LTS)版本,支持到2023年9月11日。所有旧版本(包括1.1.0、1.0.2、1.0.0和0.9.8)现在都不支持,不应该使用。这些旧版本的用户被鼓励尽快升级到3.0或1.1.1。对1.0.2的扩展支持可以访问该版本的安全修复。
- OpenSSL 3.0是 OpenSSL 的最新主要版本。OpenSSL FIPS 对象模块(FOM)3.0是 OpenSSL 3.0下载的集成部分。您不需要单独下载3.0 FOM。请参考下载内部的安装说明,并使用“ enable-fips”编译时配置选项来构建它。
- OpenSSL 3.0 系列的变化首先体现在许可证方面:之前的版本(例如:1.1.1系列)使用 OpenSSL 和 SSLeay 双重许可证;OpenSSL 3.0.0版本开始,转而使用 Apache v2 许可证
wget https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1o.tar.gz
tar zxvf OpenSSL_1_1_1o.tar.gz
cd openssl-OpenSSL_1_1_1o/
./config --prefix=/usr/local/openssl
make depend
make tests
make && make install
#检查函数库,通过检查确认缺少的函数库
ldd /usr/local/openssl/bin/openssl
#添加所缺函数库
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v #更新函数库
/usr/local/openssl/bin/openssl version #查看新安装的版本
#查看旧版本openssl命令在哪里,这里根据实际情况,进行下一步
which openssl
mv /usr/bin/openssl /usr/bin/openssl.old #将旧版本openssl移除
#新版本制作软链接
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
openssl version 最后查看版本,更新完毕
编译安装OpenSSH
## 下载openssh tar包
https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.0p1.tar.gz
## 备份ssh配置目录
mv /etc/ssh{,.bak}
# ubuntu上类似SELinux的是apparmor,所以不要指定--with-selinux
./configure --prefix=/usr/local/openssh --exec-prefix=/usr --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/openssl --with-md5-passwords --with-pam --mandir=/usr/share/man --with-zlib=/usr/local/zlib --with-privsep-path=/var/lib/sshd --without-hardening
……
PAM is enabled. You may need to install a PAM control file for sshd, otherwise password authentication may fail.
Example PAM control files can be found in the contrib/ subdirectory
## 这里虽然让用新的pam文件替换掉旧的/etc/pam.d/sshd,但Ubuntu上是不需要替换的。
sudo make && make install
……
make[1]: Entering directory `/opt/openssh-8.6p1/openbsd-compat'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/opt/openssh-8.6p1/openbsd-compat'
/bin/mkdir -p /usr/bin
/bin/mkdir -p /usr/sbin
/bin/mkdir -p /usr/share/man/man1
/bin/mkdir -p /usr/share/man/man5
/bin/mkdir -p /usr/share/man/man8
/bin/mkdir -p /usr/libexec
/bin/mkdir -p -m 0755 /var/lib/sshd
/usr/bin/install -c -m 0755 -s ssh /usr/bin/ssh
/usr/bin/install -c -m 0755 -s scp /usr/bin/scp
/usr/bin/install -c -m 0755 -s ssh-add /usr/bin/ssh-add
/usr/bin/install -c -m 0755 -s ssh-agent /usr/bin/ssh-agent
/usr/bin/install -c -m 0755 -s ssh-keygen /usr/bin/ssh-keygen
/usr/bin/install -c -m 0755 -s ssh-keyscan /usr/bin/ssh-keyscan
/usr/bin/install -c -m 0755 -s sshd /usr/sbin/sshd
/usr/bin/install -c -m 4711 -s ssh-keysign /usr/libexec/ssh-keysign
/usr/bin/install -c -m 0755 -s ssh-pkcs11-helper /usr/libexec/ssh-pkcs11-helper
/usr/bin/install -c -m 0755 -s ssh-sk-helper /usr/libexec/ssh-sk-helper
/usr/bin/install -c -m 0755 -s sftp /usr/bin/sftp
/usr/bin/install -c -m 0755 -s sftp-server /usr/libexec/sftp-server
/usr/bin/install -c -m 644 ssh.1.out /usr/share/man/man1/ssh.1
/usr/bin/install -c -m 644 scp.1.out /usr/share/man/man1/scp.1
/usr/bin/install -c -m 644 ssh-add.1.out /usr/share/man/man1/ssh-add.1
/usr/bin/install -c -m 644 ssh-agent.1.out /usr/share/man/man1/ssh-agent.1
/usr/bin/install -c -m 644 ssh-keygen.1.out /usr/share/man/man1/ssh-keygen.1
/usr/bin/install -c -m 644 ssh-keyscan.1.out /usr/share/man/man1/ssh-keyscan.1
/usr/bin/install -c -m 644 moduli.5.out /usr/share/man/man5/moduli.5
/usr/bin/install -c -m 644 sshd_config.5.out /usr/share/man/man5/sshd_config.5
/usr/bin/install -c -m 644 ssh_config.5.out /usr/share/man/man5/ssh_config.5
/usr/bin/install -c -m 644 sshd.8.out /usr/share/man/man8/sshd.8
/usr/bin/install -c -m 644 sftp.1.out /usr/share/man/man1/sftp.1
/usr/bin/install -c -m 644 sftp-server.8.out /usr/share/man/man8/sftp-server.8
/usr/bin/install -c -m 644 ssh-keysign.8.out /usr/share/man/man8/ssh-keysign.8
/usr/bin/install -c -m 644 ssh-pkcs11-helper.8.out /usr/share/man/man8/ssh-pkcs11-helper.8
/usr/bin/install -c -m 644 ssh-sk-helper.8.out /usr/share/man/man8/ssh-sk-helper.8
/bin/mkdir -p /etc/ssh
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
/usr/sbin/sshd -t -f /etc/ssh/sshd_config
# 修改sshd_config,放开PAM认证
#UsePAM no
UsePAM yes
验证并启动openssh
ssh -V
OpenSSH_8.6p1, OpenSSL 1.1.1o 15 Mar 2022
service ssh restart
service ssh status
ssh start/spawned, process 1268
FAQ
正常情况下,执行完上述步骤之后,一切都OK,但也许会有如下现象:
问题一:公钥认证登录失败
查看/var/log/auth.log发现报错:
userauth_pubkey: signature algorithm ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
执行如下命令发现是支持ssh-rsa的:
ssh -Q PubkeyAcceptedAlgorithms ssh-ed25519 ssh-ed25519-cert-v01@openssh.com sk-ssh-ed25519@openssh.com sk-ssh-ed25519-cert-v01@openssh.com ssh-rsa rsa-sha2-256 rsa-sha2-512 ssh-dss ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521 sk-ecdsa-sha2-nistp256@openssh.com webauthn-sk-ecdsa-sha2-nistp256@openssh.com ssh-rsa-cert-v01@openssh.com rsa-sha2-256-cert-v01@openssh.com rsa-sha2-512-cert-v01@openssh.com ssh-dss-cert-v01@openssh.com ecdsa-sha2-nistp256-cert-v01@openssh.com ecdsa-sha2-nistp384-cert-v01@openssh.com ecdsa-sha2-nistp521-cert-v01@openssh.com sk-ecdsa-sha2-nistp256-cert-v01@openssh.com
应该是openssh默认不支持了,手动修改sshd_config:
PubkeyAcceptedAlgorithms +ssh-rsa
重新加载配置文件:service ssh reload
重新登录,恢复正常。
问题二:openssh升级之后,service ssh restart总卡死,且password认证失败。
解决:(未验证到底因为啥恢复正常的)
1、修改/etc/init.d/ssh 将其check_privsep_dir()中的/var/run/sshd修改成/var/lib/sshd,重启服务OK了。
check_privsep_dir() { ? ? # Create the PrivSep empty dir if necessary ? ? if [ ! -d /var/lib/sshd ]; then ? ? ? ? mkdir /var/lib/sshd ? ? ? ? chmod 0755 /var/lib/sshd ? ? fi }
2、重装了libpam0g-dev
|