Se você deseja operar no ambiente de produção, leia todo o documento.
Ambiente experimental: sistema offline Centos7.6.
A compilação do openssh 9.1p1 foi concluída com sucesso.
1. Prepare o pacote de código-fonte openssh
Comece no diretório inicial e defina o diretório de trabalho
cd ~
Baixe o pacote fonte do openssh em openssh.com
Você pode primeiro tentar ver se o seu navegador consegue clicar no link abaixo para evitar que o servidor não obtenha o endereço correspondente.
# 下载需要的安装包
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.0p1.tar.gz
#Baixe o pacote de código-fonte do plug-in de diálogo de senha x11-ssh-askpass x11, opcional. Se você não precisa de x11-ssh-askpass, você pode pular o pacote de código-fonte modificando o arquivo de especificações.
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
Verifique a assinatura do arquivo, opcional
# 从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. Instale o ambiente rpm-build e compilação
Instale o pacote rpm-build e outros pacotes necessários para compilação
yum install rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel unzip
Adicionar suporte a askpass requer adicionar o pacote de dependência de instalação libxXt-devel imake gtk2-devel
yum install libXt-devel imake gtk2-devel
Crie o diretório de trabalho rpm-build, SOURCES para colocar o pacote de código fonte, SPECS para colocar o arquivo de configuração
mkdir ~/rpmbuild
mkdir ~/rpmbuild/SOURCES
mkdir ~/rpmbuild/SPECS
Instruções complementares, diretório em rpmbuild
- BUILD diretório temporário para compilar pacotes rpm
- BUILDROOT O diretório de instalação temporário do software gerado após a compilação
- O diretório onde o pacote rpm instalável finalmente gerado pelo RPMS está localizado
- FONTES Diretório onde todos os códigos-fonte e arquivos de patch são armazenados
- Diretório SPECS onde os arquivos SPEC são armazenados (importante)
- O caminho final de armazenamento do formato de código-fonte rpm do software SRPMS.
Copie o pacote de código-fonte para o diretório de trabalho rpmbuild.
cp ~/openssh-9.0p1.tar.gz ~/rpmbuild/SOURCES
Adicione suporte askpass, se necessário
cp ~/x11-ssh-askpass-1.2.4.1.tar.gz ~/rpmbuild/SOURCES
3. Extraia o arquivo de especificações
Extraia o arquivo de especificações do pacote fonte [ o arquivo de especificações necessário é extraído do pacote 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. Modifique o arquivo de especificações
Se você não precisa do askpass, você pode pular o pacote de código-fonte x11-ssh-askpass modificando os parâmetros do arquivo de especificações. Existem 3 lugares que precisam ser comentados.
# 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
Resolva o erro openssl-devel<1.1.
Este erro também existe na versão 9.1p1. Ele precisa ser comentado manualmente.
Comente os seguintes itens de configuração
#BuildRequires: openssl-devel < 1.1
Se a compilação falhar, a seguinte
mensagem de erro será exibida: Um arquivo instalado (mas descompactado) foi encontrado:
/usr/libexec/openssh/ssh-sk-helper
/usr/share/man/man8/ssh-sk-helper.8. gz
RPM 构建错误:
发现已安装(但未打包的)文件:
/usr/libexec/openssh/ssh-sk-helper
/usr/share/man/man8/ssh-sk-helper.8.gz
A verificação descobriu que o arquivo de especificações integrado foi atualizado pela última vez em 2018, o ssh-sk-helper foi adicionado em dezembro de 2019 e o arquivo de especificações não está incluído em %file. Modifique o arquivo de especificações
.
在%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. Compilar e gerar rpm
cd ~/rpmbuild/SPECS
rpmbuild -ba openssh.spec
Há muita saída. Contanto que a última seja "+ exit 0", ela será gerada com sucesso. O
arquivo gerado é armazenado em ~/rpmbuild/RPMS.
Por ser compilado para x86_64, está no ~/ diretório 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 6月 25 15:10 openssh-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 44312 6月 25 15:10 openssh-askpass-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 24696 6月 25 15:10 openssh-askpass-gnome-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 580532 6月 25 15:10 openssh-clients-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 2958016 6月 25 15:10 openssh-debuginfo-9.0p1-1.el7.centos.x86_64.rpm
-rw-rw-r--. 1 user1 user1 419928 6月 25 15:10 openssh-server-9.0p1-1.el7.centos.x86_64.rpm
[user1@localhost x86_64]$
6. Instalação
Por favor, tente iniciar o serviço telnet antes da instalação.
Além disso, faça backup da configuração, o que deve ser feito!
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/
Instalação via atualização
Não é recomendado usar o método de desinstalação e instalação agora, pois este método causará alguns problemas e fará com que o serviço sshd não seja iniciado automaticamente.
1. Descompacte o pacote de instalação e digite o diretório onde o rpm está armazenado.
2. Execute o comando de instalação yum:
yum -y localinstall openssh*.rpm
3. Restaure as configurações do PAM
cp -f ~/ssh_bak/sshd /etc/pam.d/
O arquivo de serviço auto-empacotado não inclui o serviço de gerenciamento systemd. Você mesmo precisa adicioná-lo. Como o pacote rpm integrado do centos contém sshd-keygen que não existe no pacote original, pode ocorrer um erro de arquivo não encontrado. Por favor, execute com cuidado. Se você não usa o gerenciamento de arquivos de serviço Use chkconfig para gerenciar a inicialização do sshd.
4. Modifique as permissões de acesso aos arquivos principais
#修改/etc/ssh/ssh_host_* 权限
chmod 400 /etc/ssh/ssh_host_*
5. Restaurar arquivos de configuração (opcional)
Observe que esta etapa é opcional e só é usada para solucionar erros ou restaurar configurações quando o serviço falha ao iniciar!
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. Modifique sshd_config
Uma nova versão do arquivo de configuração sshd_config.rpmnew será criada durante a instalação. Se a configuração original não puder entrar em vigor, você poderá consultar a nova configuração.
vim /etc/ssh/sshd_config
## 务必保证以下几项设置都正确!否则会进不了服务器!
# 允许root登录
PermitRootLogin yes
# 允许密码登录
PasswordAuthentication yes
7. Tente reiniciar o processo sshd
systemctl restart sshd
# 如果是通过sshd.socket服务启动可以执行以下命令
systemctl restart sshd.socket
8. Tente estabelecer uma nova conexão ssh
ssh -v localhost
Preste atenção às informações da versão remota de saída. Se a conexão não puder ser feita neste momento, você precisará verificar imediatamente se as configurações acima estão corretas.
...
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
...
O algoritmo de troca de chaves SecureCRT7.1 não está na lista padrão do OpenSSH8.3. O XShell6 não tem esse problema.
O algoritmo suportado pelo SecureCRT7.1 precisa ser adicionado ao arquivo de configuração.
sshd -T | grep kexalgorithms>> /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
#或者手动在KexAlgorithms添加 diffie-hellman-group14-sha1
Conteúdo adicional a seguir
20210426 Complementado
durante um processo de atualização, descobriu-se que após a atualização, o comando sshd -V foi usado para verificar a versão sshd, e o resultado retornado ainda era a versão anterior (Centos7.8 openssh 7.9p1 foi atualizado para openssh 8.6p1 ). Após pesquisa, descobriu-se que o comando sshd foi mapeado para dois arquivos, um é /usr/sbin/sshd, este é o arquivo de inicialização padrão, verifique a versão, é 8.6p1, o outro está em um diretório diferente , chamar sshd no bash usará outra versão antiga do sshd, portanto, a versão sshd usada atualmente não pode ser verificada por meio de sshd -V. É melhor usar o comando ssh -v root@ip para verificar. Além disso, é melhor excluir a versão antiga do caminho sshd e do caminho ssh em PATH para evitar outras operações erradas desnecessárias.
Suplemento 20210730:
Ao atualizar o Openssh, sua inicialização automática falhou porque o arquivo /etc/sysconfig/sshd não foi restaurado.Depois que a máquina foi reiniciada, o serviço sshd não pôde ser iniciado e a máquina não pôde ser acessada.
Apêndice 1: Downgrade
yum -y downgrade 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/
Apêndice 2: Use Telnet para fazer login e instalar
Faça login como root via ssh
para instalar o serviço 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
Após a conclusão da instalação, verifique se o login do ssh foi bem-sucedido e se você ainda pode usar o ssh para efetuar login após o servidor ser reiniciado e, em seguida:
#启动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
Para modificar o número da porta do Telnet, seu arquivo de configuração é: /usr/lib/systemd/system/telnet.socket
Apêndice 3: Outras referências
/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