目录
对于很多小伙伴来说升级openssh是一件很痛苦的事情(各种问题搞得香菇)。但是漏洞不等人呐说有就有。没办法面对漏洞跪着也要搞完(苦逼运维的自白)。以下的操作说明是小M连续在本地环境(不敢搞生产呀)反复测了N次总结的一些经验与大家分享,希望小伙伴们可以在面对open大坑时也能坦然面对、从容蛋定~~~,废话不多说直奔主题。
openssl下载地址:Release OpenSSL_1_1_1q · openssl/openssl · GitHub
zlib下载地址:zlib Home Site
openssh下载地址:pub-OpenBSD-OpenSSH-portable安装包下载_开源镜像站-阿里云
以上为本次升级所需包的下载地址,后续更新时需注意下载对应的安全无漏洞版本
升级前先下载以上三个包并上传到服务器,本次三个包的版本分别是:openssl:1.1.1q;openssh:9.0.p1;zlib:1.2.1
说明:升级openssh前需要安装多个依赖,目标服务器必须可连接外网
检查服务器是否可连外网
# 检查能否连外网
curl -v www.baidu.com
升级前查看当前操作系统的openssl的版本是多少,若在漏洞范围内则确定本次需升级
# 查看当前openssl版本
openssl version
# 查看当前openssh版本
ssh -V
为防止升级openssh后无法通过ssh连接,升级前需要设置服务器可通过telnet登录,待ssh升级验证通过后再关闭
# 1.安装xinetd、telnet
yum install -y xinetd telnet-server
# 2.配置telnet(默认无telnet配置文件,首次需新增)
vi /etc/xinetd.d/telnet
service telnet
{
disable = yes
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
# 添加完成后:wq保存退出
# 3.配置telnet登录的终端类型,在/etc/securetty文件末尾增加终端
vi /etc/securetty
pts/0
pts/1
pts/2
pts/3
# 添加完成后:wq保存退出
# 4.启动telnet服务
systemctl enable xinetd --now
systemctl enable telnet.socket --now
# 5.查看telnet端口使用启用(telnet默认端口:23),若启
ss -luntp | grep 23
# 6.若5可以看到23端口处于启动状态,则可在windows下 cmd 执行 telnet ip 验证是否可以连接,可连接则代表无问题,否则查看上述的步骤是否有问题
至此telnet启用完成
# 目标服务器上建立两个目录,/data /backup
mkdir /data # 用于存放安装包
mkdir -p /backup/openssl # 存放原openssl备份文件
mkdir /backup/openssh # 存放原openssh有关的备份文件
依赖环境需在安装openssl、openssh前进行安装,否则后续安装时会覆盖已经安装好的openssl
# 1.安装依赖环境
yum install -y zlib-devel openssl-devel pam-devel openssl gcc perl pam* zlib*
升级顺序:openssl —— openssh
# openssl依赖库
cp /usr/lib64/libcrypto.so.10 /backup/openssl
cp /usr/lib64/libcrypto.so.1.0.2k /backup/openssl
cp /usr/lib64/libssl.so.10 /backup/openssl
cp /usr/lib64/libssl.so.1.0.2k /backup/openssl
# openssl可执行文件
mv /usr/bin/openssl /backup/openssl
# openssl依赖文件
mv /usr/include/openssl /backup/openssl/include_openssl
# 配置文件
cp /etc/ld.so.conf /backup/openssl/etc_ld.so.conf
# 1.删除原有的ssl目录
rm -rf /etc/ssl
# 2.解压openssl安装包
cd /data; tar -xf openssl-OpenSSL_1_1_1q.tar.gz
# 进入解压目录,执行编译安装
cd openssl-OpenSSL_1_1_1q
./config shared --prefix=/usr/local/ssl
# 成功显示
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 1.1.1q (0x1010111fL) for linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile
**********************************************************************
*** ***
*** OpenSSL has been successfully configured ***
*** ***
*** If you encounter a problem while building, please open an ***
*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
*** and include the output from the following command: ***
*** ***
*** perl configdata.pm --dump ***
*** ***
*** (If you are new to OpenSSL, you might want to consult the ***
*** 'Troubleshooting' section in the INSTALL file first) ***
*** ***
**********************************************************************
# 若无报错则继续执行,否则处理报错问题
make && make install
# 查看编译安装结果(返回0代表编译安装成功)
echo $?
# 3.建立软连接及修改配置文件
echo "/usr/local/ssl/lib">>/etc/ld.so.conf
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -sf /usr/local/ssl/include/openssl /usr/include/openssl
echo "/usr/local/ssl/lib" >/etc/ld.so.conf.d/openssl.conf
ldconfig
# 4.查看版本,若以上都无问题则此时可以看到升级后的openssl版本
openssl version
OpenSSL 1.1.1q 5 Jul 2022
至此openssl升级完成
# 1.解压zlib到data目录下
tar -xf zlib-1.2.12.tar.gz
# 2.进入zlib解压目录执行编译安装
cd zlib-1.2.12
./configure --prefix=/usr/local/zlib
# 结果展示
Checking for gcc...
Checking for shared library support...
Building shared library libz.so.1.2.12 with gcc.
Checking for size_t... Yes.
Checking for off64_t... Yes.
Checking for fseeko... Yes.
Checking for strerror... Yes.
Checking for unistd.h... Yes.
Checking for stdarg.h... Yes.
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
Checking for vsnprintf() in stdio.h... Yes.
Checking for return value of vsnprintf()... Yes.
Checking for attribute(visibility) support... Yes
# 3.编译安装
make && make install
# 4.查看编译结果(0为成功)
echo $?
# ssh配置文件目录
mv /etc/ssh /backup/openssh
# pam.d/sshd 文件
mv /etc/pam.d/sshd /backup/openssh
# 1.查看是否存在历史版本
rpm -qa | grep openssh
# 2.卸载历史版本
rpm -e --nodeps `rpm -qa | grep openssh`
# 1.在data目录下解压openssh
tar -xf openssh-9.0p1.tar.gz
# 2.进入解压目录执行编译安装
cd openssh-9.0p1
# 初始化变量
./configure --prefix=/usr/local/ssh --sysconfdir=/etc/ssh --with-openssl-includes=/usr/local/ssl/include --with-ssl-dir=/usr/local/ssl --with-zlib=/usr/local/zlib --with-md5-passwords --with-pam
# 关于prefix目录的说明:网上的资料一般建议安装在/usr目录下,这样的好处是编译安装时会直接把可执行文件放到指定的目录,无需建立软链接。但不熟悉目录结构的话则不清楚文件都放到了哪里,且不便于后期升级。据此最好指定一个其他的目录,编译安装完成后再做软链接
# 编译安装
make && make install
# 查看编译结果(0为成功)
echo $?
# 创建链接
ln -sf /usr/local/ssh/libexec /usr/libexec/openssh
ln -sf /usr/local/ssh/sbin/sshd /usr/sbin/sshd
ln -sf /usr/local/ssh/bin/scp /usr/bin/scp
ln -sf /usr/local/ssh/bin/ssh /usr/bin/ssh
ln -sf /usr/local/ssh/bin/ssh-add /usr/bin/ssh-add
ln -sf /usr/local/ssh/bin/ssh-agent /usr/bin/ssh-agent
ln -sf /usr/local/ssh/bin/ssh-keygen /usr/bin/ssh-keygen
ln -sf /usr/local/ssh/bin/ssh-keyscan /usr/bin/ssh-keyscan
# 在openssh的解压文件下执行
cp contrib/redhat/sshd.init /etc/init.d/sshd
cp contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
cp contrib/ssh-copy-id /usr/bin/ssh-copy-id
# 赋权ssh-copy-id
chmod 755 /usr/bin/ssh-copy-id
# 还原备份文件
cp /backup/openssh/ssh/sshd_config /etc/ssh/
cp /backup/openssh/ssh/ssh_config /etc/ssh/
cp /backup/openssh/sshd /etc/pam.d
# 追加到sshd_config
echo "KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1" >> /etc/ssh/sshd_config
# 修改sshd_config
vi /etc/ssh/sshd_config
# 取消PermitRootLogin yes的注释 (若不允许root远程登录则此项忽略)
PermitRootLogin yes
# 取消PubkeyAuthentication yes 的注释
PubkeyAuthentication yes
# 若UsePAM yes 默认被注释 则关闭注释
UsePAM yes
# 修改ssh_config
vi /etc/ssh/ssh_config
# 将GSSAPIAuthentication yes注释掉
#GSSAPIAuthentication yes
# 保存并退出
# 还原依赖库
mv /backup/openssl/libcrypto.so.10 /usr/lib64/libcrypto.so.10
mv /backup/openssl/libssl.so.10 /usr/lib64/libssl.so.10
# 设置开机自启
chkconfig sshd on
# 启动sshd(或者使用systemctl启动也可以)
/etc/init.d/sshd start
# 服务启动成功后,查看当前版本
ssh -V
OpenSSH_9.0p1, OpenSSL 1.1.1q 5 Jul 2022
需验证 ssh scp ssh-keygen ssh-copy-id xftp 等是否可用
# 验证ssh
# 1.使用ssh工具远程连接已经升级openssh的服务器,若可连接则代表此功能正常
# 验证ssh-keygen
# 1.清除/root/.ssh 下的所有文件
rm -rf /root/.ssh/*
# 2.执行ssh-keygen 点击空格即可
ssh-keygen
# 3.查看/root/.ssh 是否存在公私钥,若存在则代表ssh-keygen功能正常
ls /root/.ssh/
# 验证ssh-copy-id
# 1.验证条件,已通过ssh-keygen生成公私钥
# 2.将公钥上传至其他目标服务器,如:192.168.1.1
ssh-copy-id root@192.168.1.1
# 3.上传成功后通过ssh查看是否可免密登录
ssh root@192.168.1.1
# 4.若能登录则代表该功能正常
# 验证scp
# 1.在升级openssh的服务器创建测试文件test.txt
touch test.txt
# 2.使用scp将测试文件上传到已经做过免密登录的服务器上
scp test.txt root@192.168.1.1:/usr/local
# 3.若上传成功则代表该功能正常
# 验证xftp
# 1.打开xftp工具,使用升级openssh的服务器用户名密码,点击连接
# 2.若连接成功则代表该功能正常
若服务器之前做过防暴力破解加固,则还需验证当前加固是否可用
# 验证密码错误输入次数限制
# 1.编辑/etc/pam.d/sshd 文件
vi /etc/pam.d/sshd
# 在第一行添加以下内容
auth required pam_tally2.so deny=3 unlock_time=60 even_deny_root root_unlock_time=60
# 添加完成后保存退出
# 2.新打开一个终端窗口(不要直接从已保存的会话中启动),ssh远程连接此服务器,输入错误3次后输入正确的密码
ssh root@192.168.1.1
# 3.正常情况:即使输入正确的密码也无法登录服务器
# 4.等待60秒后再次输入正确的密码,若此时能够登录则代表防暴力破解功能正常
以上功能全部测试通过后即可判定此次升级openssh成功
为防止后续还会升级openssh,以上验证通过后关闭telnet连接即可,无需卸载
# 关闭telnet
systemctl disable xinetd --now
systemctl disable telnet.socket --now
至此升级工作完成。
1、由于升级openssh会带来一些不必要及不可预料的问题,如:无法远程连接、个别功能不可用、防暴力破解失效 等等,如非必要尽可能不要做升级操作,若必须升级,一定要在自己的虚拟环境下反复测试验证几遍,确保无问题后再上生产操作,尽可能的降低升级风险。
2、本说明文档的实验环境是:centos7.9 x86_64,理论上支持同服务器架构 centos7.x 系列的openssh升级。当前未在arm架构上做测试,无法确保此升级方案在arm架构上的可行性!!!
3、升级过程中一定要操作说明做好相关的备份,以防升级失败时可快速还原
4、升级openssh存在不稳定性,不同服务器环境可能出现的问题不同,升级过程中具体问题需具体分析。
5、升级openssh后免密登录密钥失效,需重新生成密钥并上传到要免密登录的服务器当中。
原创不易,转载的小伙伴请标明出处,谢谢~
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我们有一个目前在Rails2.3.12版和Ruby1.8.7版上运行的应用程序。我们想将我们的应用程序更新到Rails4.0和Ruby2.1.0。我们有大约200个模型和150个Controller。我想知道升级过程需要多大的努力。您还可以提供升级可以遵循的步骤。我们应该先升级Ruby然后再升级Rails还是相反? 最佳答案 您想要实现的目标将是史诗般的努力。我无法为您提供分步说明,因为不可能在一个答案中涵盖所有情况。我建议不要同时升级Ruby和Rails,而是分步升级。升级本身的复杂性是巨大的,但只要您的应用程序具有合理的测试覆盖
我最近尝试安装rails4.1.0.beta1,但是railss导致以下错误。[RVM]/gems/ruby-2.0.0-p247/gems/activesupport-4.1.0.beta1/lib/active_support/core_ext/module/aliasing.rb:32:in`alias_method':undefinedmethod`graft'forclass`ActiveRecord::Associations::JoinDependency'(NameError)[RVM]/gems/ruby-2.0.0-p247/gems/activesupport-4
我目前有一个运行在4.2.5上的Rails应用程序,我想使用ActionCable而不必将整个应用程序升级到Rails5.0.0.beta3版本并冒破坏所有其他gem的风险。按照我在互联网上看到的指南,我已经尝试过gem'actioncable',github:'rails/actioncable'这不起作用,因为ActionCable存储库已合并到Rails存储库中。我什至试过gem'actioncable',github:'rails/rails'但这似乎不适用于ActionCable合并到Rails时发生的版本重新编号。(唯一低于5.0.0.beta*的版本是0.0.0,这似乎是
我最近正在进行Rails5升级,当我尝试启动Rails控制台时遇到了这个错误:/actionpack-5.0.0/lib/action_controller/test_case.rb:49:ininitialize':wrongnumberofarguments(0for2)(ArgumentError)当前bundleupdaterails已经完成了gem依赖项的解决,足以更新到5.0.0,rspec正在运行(尽管我正在修复很多中断)。我也可以运行railss没有错误。这里是代码中断行:https://github.com/rails/rails/blob/master/action