Centos 7 は openssh rpm パッケージをアップグレードします

本番環境で運用する場合は必ず全文をお読みください
実験環境:Centos7.6 オフラインシステム
openssh 9.1p1 のコンパイルは正常に完了しました。

1. openssh ソースコードパッケージを準備する

ホームディレクトリから開始し、作業ディレクトリを設定します

cd ~

openssh ソース パッケージを openssh.com からダウンロードする

まず、サーバーが対応するアドレスを取得できないことを防ぐために、ブラウザーが下のリンクをクリックできるかどうかを確認してください。

# 下载需要的安装包
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.0p1.tar.gz

#x11-ssh-askpass x11 パスワード ダイアログ プラグインのソース コード パッケージをダウンロードします (オプション)。x11-ssh-askpass が必要ない場合は、仕様ファイルを変更することでソース コード パッケージをスキップできます。

wget https://src.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/x11-ssh-askpass-1.2.4.1.tar.gz

ファイル署名の検証 (オプション)

# 从openbsd下载签名公钥
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/RELEASE_KEY.asc
# 导入公钥
gpg --import RELEASE_KEY.asc
# 下载源码包签名
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.0p1.tar.gz.asc
# 检验签名
gpg --verify openssh-9.0p1.tar.gz.asc openssh-9.0p1.tar.gz

2. rpm-build とコンパイル環境をインストールします。

rpm-build パッケージとコンパイルに必要なその他のパッケージをインストールします。

yum install rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel unzip

askpass サポートを追加するには、インストール依存関係パッケージ libxXt-devel imake gtk2-devel を追加する必要があります

yum install libXt-devel imake gtk2-devel

rpm-build 作業ディレクトリ、ソース コード パッケージを配置する SOURCES、構成ファイルを配置する SPECS を作成します。

mkdir ~/rpmbuild
mkdir ~/rpmbuild/SOURCES
mkdir ~/rpmbuild/SPECS

補足説明、rpmbuild配下のディレクトリ

  • rpm パッケージをコンパイルするための BUILD 一時ディレクトリ
  • BUILDROOT コンパイル後に生成されるソフトウェアの一時インストール ディレクトリ
  • RPMS によって最終的に生成されたインストール可能な rpm パッケージが配置されるディレクトリ。
  • SOURCES すべてのソース コードとパッチ ファイルが保存されるディレクトリ
  • SPEC ファイルが保存される SPECS ディレクトリ (重要)
  • SRPMS ソフトウェアの最終的な rpm ソース コード フォーマットの保存パス。
    ソース コード パッケージを rpmbuild 作業ディレクトリにコピーします。
cp ~/openssh-9.0p1.tar.gz ~/rpmbuild/SOURCES 

必要に応じて、askpass サポートを追加します

cp ~/x11-ssh-askpass-1.2.4.1.tar.gz ~/rpmbuild/SOURCES

3.スペックファイルの抽出

ソース パッケージからスペック ファイルを抽出します [必要なスペック ファイルは tar パッケージから抽出されます]

tar -zxvf openssh-9.0p1.tar.gz openssh-9.0p1/contrib/redhat/openssh.spec
cp ~/openssh-9.0p1/contrib/redhat/openssh.spec ~/rpmbuild/SPECS

4.仕様ファイルを変更する

askpass が必要ない場合は、仕様ファイルのパラメーターを変更することで x11-ssh-askpass ソース コード パッケージをスキップできます。コメントする必要がある場所が 3 か所あります。

# Do we want to disable building of x11-askpass? (1=yes 0=no)
%global no_x11_askpass 1

# Do we want to disable building of gnome-askpass? (1=yes 0=no)
%global no_gnome_askpass 1

#注释掉Source1 x11-ssh-askpass包引用
Source1: http://www.jmknoble.net/software/x11-ssh-askpass/x11-ssh-askpass-%{
    
    aversion}.tar.gz

openssl-devel<1.1 エラーを解決します。
このエラーはバージョン 9.1p1 にも存在します。手動でコメントする必要があります。
次の構成項目
#BuildRequires をコメント化します: openssl-devel < 1.1

コンパイルが失敗すると、次の
エラー メッセージが表示されます。インストール済み (ただしパッケージ化されていない) ファイルが見つかりました:
/usr/libexec/openssh/ssh-sk-helper
/usr/share/man/man8/ssh-sk-helper.8。ガズ

RPM 构建错误:
发现已安装(但未打包的)文件:
/usr/libexec/openssh/ssh-sk-helper
/usr/share/man/man8/ssh-sk-helper.8.gz

検証の結果、組み込みのスペック ファイルの最終更新は 2018 年で、ssh-sk-helper の追加は 2019 年 12 月で、スペック ファイルが %file に含まれていないことが判明したので、スペック ファイルを変更します

在%attr(0644,root,root) %{
    
    _mandir}/man8/ssh-pkcs11-helper.8*后追加
%attr(0755,root,root) %{
    
    _libexecdir}/openssh/ssh-sk-helper
%attr(0644,root,root) %{
    
    _mandir}/man8/ssh-sk-helper.8*

5. コンパイルして rpm を生成する

cd ~/rpmbuild/SPECS
rpmbuild -ba openssh.spec

たくさんの出力があります。最後の出力が "+ exit 0" であれば、正常に生成されます。生成
されたファイルは ~/rpmbuild/RPMS に保存されます。x86_64
用にコンパイルされているため、~/ にあります。 rpmbuild/RPMS/x86_64 ディレクトリ。

/home/<user_name>/rpmbuild/RPMS/x86_64
# 如果没有编译askpass的话,不会生成 askpass包,所以实际生成的rpm包数量为4个或者6个(带askpass)
[user1@localhost x86_64]$ ll
总用量 4536
-rw-rw-r--. 1 user1 user1 602772 625 15:10 openssh-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 44312 625 15:10 openssh-askpass-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 24696 625 15:10 openssh-askpass-gnome-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 580532 625 15:10 openssh-clients-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 2958016 625 15:10 openssh-debuginfo-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 419928 625 15:10 openssh-server-9.0p1-1.el7.centos.x86_64.rpm
[user1@localhost x86_64]$

6. インストール

インストール前に Telnet サービスを開始してください。
また、構成をバックアップしてください。これは必ず行う必要があります。

mkdir ~/ssh_bak
mkdir ~/ssh_bak/service
# 备份PAM配置
cp /etc/pam.d/sshd ~/ssh_bak/
# 备份sshd_config
cp /etc/ssh/sshd_config ~/ssh_bak/
# 备份sshd的启动服务
cp /usr/lib/systemd/system/sshd* ~/ssh_bak/service/

アップグレードによるインストール

この方法では問題が発生し、sshd サービスが自動的に開始されなくなるため、現時点ではアンインストールとインストールの方法を使用することはお勧めしません。

1. インストール パッケージを解凍し、rpm が保存されているディレクトリに移動します
2. yum インストール コマンドを実行します。

yum -y localinstall openssh*.rpm

3. PAM設定を復元する

cp -f ~/ssh_bak/sshd /etc/pam.d/

自己パッケージ化されたサービス ファイルには systemd 管理サービスが含まれていません。自分で追加する必要があります。centos の組み込み rpm パッケージには、元のパッケージには存在しない sshd-keygen が含まれているため、ファイルが見つからないエラーが発生する可能性があります。サービスファイル管理を使用しない場合 sshdの起動管理にはchkconfigを使用してください。

4. キーファイルのアクセス権限を変更する

#修改/etc/ssh/ssh_host_* 权限
chmod 400 /etc/ssh/ssh_host_*

5. 設定ファイルの復元 (オプション)

この手順はオプションであり、エラーのトラブルシューティングまたはサービスの開始に失敗した場合の構成の復元にのみ使用されることに注意してください。

cp -f ~/ssh_bak/sshd /etc/sysconfig/sshd
cp -f ~/ssh_bak/pam.d/sshd /etc/pam.d/sshd
cp -f ~/ssh_bak/service/* /usr/lib/systemd/system/sshd*

6. sshd_config を変更する

インストール中に新しいバージョンの構成ファイル sshd_config.rpmnew が作成されます。元の構成が有効にならない場合は、新しい構成を参照できます。

vim /etc/ssh/sshd_config
## 务必保证以下几项设置都正确!否则会进不了服务器!
# 允许root登录
PermitRootLogin yes
# 允许密码登录
PasswordAuthentication yes

7. sshd プロセスを再起動してみます。

systemctl restart sshd
# 如果是通过sshd.socket服务启动可以执行以下命令
systemctl restart sshd.socket

8. 新しい SSH 接続の確立を試行します

ssh -v localhost

出力されたリモートのバージョン情報に注意してください。この時点で接続できない場合は、上記の設定が正しいかどうかをすぐに確認する必要があります。

...
debug1: Local version string SSH-2.0-OpenSSH_9.0
debug1: Remote protocol version 2.0, remote software version OpenSSH_9.1
debug1: compat_banner: match: OpenSSH_9.0 pat OpenSSH* compat 0x04000000
...

SecureCRT7.1 の鍵交換アルゴリズムは OpenSSH8.3 のデフォルトのリストに含まれていません。XShell6 ではこの問題は発生しません
。SecureCRT7.1 でサポートされているアルゴリズムを設定ファイルに追加する必要があります。

sshd -T | grep kexalgorithms>> /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
#或者手动在KexAlgorithms添加 diffie-hellman-group14-sha1

今後の追加コンテンツ

20210426
アップグレード プロセス中に補足すると、アップグレード後、sshd -V コマンドを使用して sshd バージョンを確認すると、返された結果は以前のバージョンのままであることが判明しました (Centos7.8 openssh 7.9p1 は openssh 8.6p1 にアップグレードされました)調査の結果、sshd コマンドは 2 つのファイルにマップされていることがわかりました。1 つは /usr/sbin/sshd で、これはデフォルトの起動ファイルです。バージョンを確認してください。8.6p1 で、もう 1 つは別のディレクトリにあります。 bash で sshd を呼び出すと、別の古いバージョンの sshd が使用されるため、現在使用されている sshd のバージョンは sshd -V では確認できません。確認するにはssh -v root@ipコマンドを使用するのが最善です。また、他の不要な誤操作を避けるために、PATH 内の古いバージョンの sshd パスと ssh パスを削除することをお勧めします。
20210730 補足:
Openssh のアップグレード時に、/etc/sysconfig/sshd ファイルが復元されていないため、自動起動に失敗し、マシンを再起動しても sshd サービスが開始できず、マシンに入ることができませんでした。

付録 1: ダウングレード

yum -y ダウングレード openssh-server-7.4p1-21.el7 openssh-clients-7.4p1-21.el7 openssh-7.4p1-21.el7
/bin/cp -f ~/ssh_bak/sshd /etc/pam.d/
/bin/cp -f ~/ssh_bak/ssh_config /etc/ssh/
/bin/cp -f ~/ssh_bak/sshd_config /etc/ssh/

付録 2: Telnet を使用してログインしてインストールする

SSH 経由で root としてログインし
、Telnet サービスをインストールします。

systemctl stop firewalld
systemctl disable firewalld
yum install telnet-server
yum install xinetd
# 若不能在线安装,需要下载rpm包,不会太多,一共两三个
systemctl start telnet.socket
systemctl start xinetd
systemctl enable telnet.socket
systemctl enable xinetrd

インストールが完了したら、ssh ログインが成功し、サーバーの再起動後も ssh を使用してログインできることを確認してから、次の操作を行います。

#启动firewalld,
systemctl start firewalld
systemctl enable firewalld
#关闭telnet服务,
systemctl stop telnet.socket
systemctl stop xinetd
systemctl disable telnet.socket
systemctl disable xinetd
#卸载telnet-server,
yum erase telnet-server

Telnet のポート番号を変更するには、その構成ファイルは /usr/lib/systemd/system/telnet.socket です。

付録 3: その他の参考資料

/etc/pam.d/sshd

[root@localhost ~]# cat /etc/pam.d/sshd
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare

/usr/lib/systemd/system/sshd-keygen.service

[Unit]
Description=OpenSSH Server Key Generation
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_rsa_key
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_ecdsa_key
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_ed25519_key
PartOf=sshd.service sshd.socket

[Service]
ExecStart=/usr/sbin/sshd-keygen
Type=oneshot
RemainAfterExit=yes

/usr/lib/systemd/system/sshd.service

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

/usr/lib/systemd/system/[email protected]

[Unit]
Description=OpenSSH per-connection server daemon
Documentation=man:sshd(8) man:sshd_config(5)
Wants=sshd-keygen.service
After=sshd-keygen.service

[Service]
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=-/usr/sbin/sshd -i $OPTIONS
StandardInput=socket

/usr/lib/systemd/system/sshd.socket

[Unit]
Description=OpenSSH Server Socket
Documentation=man:sshd(8) man:sshd_config(5)
Conflicts=sshd.service

[Socket]
ListenStream=22
Accept=yes

[Install]
WantedBy=sockets.target

lib/systemd/system/sshd.service

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target                      

/lib/systemd/system/sshd.socket

[Unit]
Description=OpenSSH Server Socket
Documentation=man:sshd(8) man:sshd_config(5)
Conflicts=sshd.service

[Socket]
ListenStream=22
Accept=yes

[Install]
WantedBy=sockets.target

おすすめ

転載: blog.csdn.net/weixin_42602433/article/details/129798862