Construindo o OpenSSH para OS X?

0

Eu tenho no OS X 10.5 PowerMac (PowerPC) que eu uso para testes. A Apple abandonou o suporte para isso. Outros querem acesso à caixa para teste, então eu preciso construir e instalar um OpenSSH atualizado.

Eu visitei o openssh.com e obtive a última versão (7.1) via FTP. O link na barra lateral esquerda. Não há link de download na página inicial; você meio que tem que procurar por isso.

Infelizmente, parece que o OpenSSH não tem documentação sobre o processo. O não é configure (então não configure --help ), não há INSTALL , e não há nenhum tópico nele no OpenSSH FAQ .

Existe um README que aponta para o link . Infelizmente, isso não fornece instruções de compilação. Curiosamente, ele fala sobre ambos configure e autoreconf que não estão presentes no tarball .

Eu preciso usar uma versão atualizada do OpenSSL. O OpenSSL 1.0.2d foi criado e instalado em /usr/local . Eu também preciso garantir que o OpenSSH vincule estaticamente ao OpenSSL alternativo para que ele não use a versão de nível inferior do OpenSSL 0.9.8 fornecida pela Apple.

Como eu construo o OpenSSH usando o OpenSSL atualizado no OS X? Onde encontro as instruções?

    
por jww 23.08.2015 / 02:55

2 respostas

1

How do I build OpenSSH using the updated OpenSSL on OS X? Where do I find the instructions?

Grawity estava correto - eu baixei o OpenSSH errado. Eu precisava de um portátil, e não aquele fornecido no link FTP. Os portáteis estão listados na parte inferior do OpenSSH Portátil .

Depois de ter o portátil, descompacte e execute o seguinte. O seguinte pressupõe que você tenha um OpenSSL libcrypto atualizado instalado em /usr/local/ssl/darwin e um Zlib libz at /usr/local atualizado. Ajuste-os ao seu gosto.

Substitua -lz pelo caminho absoluto para arquivar

Isso é necessário para garantir a vinculação estática, porque não há uma opção aparente para ela em configure . Quando o binário é construído, otool -L mostrará que não há dependências externas do Zlib.

$ grep "\-lz" *
configure:{ echo "$as_me:$LINENO: checking for deflate in -lz" >&5
configure:echo $ECHO_N "checking for deflate in -lz... $ECHO_C" >&6; }
configure:LIBS="-lz  $LIBS"
configure:  LIBS="-lz $LIBS"
configure:      LIBS="$LIBS -lz"
configure.ac:       LIBS="$LIBS -lz"

Então:

$ sed -i "" 's|-lz|/usr/local/lib/libz.a|g' config.h.in configure configure.ac
$

Substitua -lcrypto por um caminho absoluto para arquivar

Isso é necessário para garantir a vinculação estática, porque não há uma opção aparente para ela em configure . Quando o binário é construído, otool -L mostrará que não há dependências externas do OpenSSL.

$ grep "\-lcrypto" *
configure:  LIBS="-lcrypto $LIBS"
configure.ac:   LIBS="-lcrypto $LIBS"

Então:

$ sed -i "" 's|-lcrypto|/usr/local/ssl/darwin/lib/libcrypto.a|g' configure configure.ac
$

Acima, uso /usr/local/ssl/darwin as --openssldir ao criar a biblioteca OpenSSL. Geralmente é apenas /usr/local/ssl . Ajuste-o conforme necessário.

Configurar o OpenSSH

Configure o OpenSSH com os caminhos necessários. Talvez seja necessário incluir uma biblioteca do OS X também.

Se find /usr/lib/ -name libsandbox* retornar libsandbox.dylib , você precisará incluir --with-libs="-lsandbox . Está faltando no OS X 10.5, mas está presente no OS X 10.8. Se a biblioteca estiver presente, mas --with-libs for omitido, isso resultará em um erro semelhante a riemann.local sshd[15748]: fatal: ssh_sandbox_child: sandbox_init: dlopen(/usr/lib/libsandbox.1.dylib, 261): image not found [preauth] .

$ ./configure --without-ssh1 --with-ssl-dir=/usr/local/ssl/darwin --with-zlib=/usr/local \
  --with-libs="-lsandbox" --prefix=/usr/local
checking for gcc... gcc
checking for C compiler default output file name... a.out
...

OpenSSH has been configured with the following options:
                     User binaries: /usr/local/bin
                   System binaries: /usr/local/sbin
               Configuration files: /usr/local/etc
...

Host: x86_64-apple-darwin12.6.0
Compiler: gcc
Compiler flags: -g -O2 -Qunused-arguments -Wunknown-warning-option -Wall -Wpointer-arith 
    -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess
    -Wno-pointer-sign -Wno-unused-result -fno-strict-aliasing -D_FORTIFY_SOURCE=2
    -ftrapv -fno-builtin-memset -fstack-protector-all -fPIE 
Preprocessor flags: -I/usr/local/ssl/darwin/include -I/usr/local/include 
Linker flags: -L/usr/local/ssl/darwin/lib -L/usr/local/lib  -fstack-protector-all -pie
Libraries: /usr/local/ssl/darwin/lib/libcrypto.a /usr/local/lib/libz.a -lsandbox -lresolv

Você pode precisar de --with-pam para que a autenticação de senha funcione. Eu não estava preocupado com o recurso, então não adicionei a opção de configuração.

Construa e instale o OpenSSH

O -fwrapv é um pouco problemático quando visto em software de alta integridade. Isso geralmente significa que há um programa C ilegal com comportamento indefinido em andamento. Os desenvolvedores não corrigiram, então eles usam -fwrapv como ajudante de bandas .

$ make
conffile='echo sshd_config.out | sed 's/.out$//''; \
...

gcc -g -O2 -Qunused-arguments -Wunknown-warning-option -Wall -Wpointer-arith -Wuninitialized
  -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign
  -Wno-unused-result -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset
  -fstack-protector-all -fPIE  -I. -I.. -I. -I./.. -I/usr/local/ssl/darwin/include
-I/usr/local/include  -DHAVE_CONFIG_H -c arc4random.c
gcc -g -O2 -Qunused-arguments -Wunknown-warning-option -Wall -Wpointer-arith -Wuninitialized
  -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign
  -Wno-unused-result -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset
  -fstack-protector-all -fPIE  -I. -I.. -I. -I./.. -I/usr/local/ssl/darwin/include
  -I/usr/local/include  -DHAVE_CONFIG_H -c bsd-asprintf.c
...

Dependências externas (ou falta delas) podem ser verificadas com:

$ otool -L ./sshd 
./sshd:
    /usr/lib/libsandbox.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

Infelizmente, não há metas make check ou make test , por isso não há maneira aparente de testar o software antes de instalá-lo.

$ sudo make install
...

Generating public/private ed25519 key pair.
Your identification has been saved in /usr/local/etc/ssh_host_ed25519_key.
Your public key has been saved in /usr/local/etc/ssh_host_ed25519_key.pub.
The key fingerprint is:
SHA256:u/xQ6haFqxjG0fBgSMt0W58N8zmhu+NmyQxNMkMcwPc [email protected]
The key's randomart image is:
+--[ED25519 256]--+
| .ooooo.o .      |
| o.o=o+. B o     |
|  o..B .+.=      |
|    . * E...     |
|   . . *So.      |
|    + . +=       |
|   . o =*o       |
|    . .+B+       |
|       +=..      |
+----[SHA256]-----+
...

Crie um Plist para o novo binário SSH

O seguinte usa o ssh.plist existente, remove o script do Apple wrapper e altera o número da porta. Copie para /System/Library/LaunchDaemons/ssh-7.1.plist .

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <true/>
    <key>Label</key>
    <string>com.openssh.sshd.7-1</string>
    <key>Program</key>
    <string>/usr/local/sbin/sshd</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/sbin/sshd</string>
        <string>-i</string>
        <string>-e</string>
        <string>-f</string>
        <string>/usr/local/etc/sshd_config</string>
        <string>-o</string>
        <string>PidFile=/var/run/sshd-7.1.pid</string>
    </array>
    <key>Sockets</key>
    <dict>
            <key>Listeners</key>
            <dict>
                    <key>SockServiceName</key>
                    <string>1522</string>
            </dict>
    </dict>
    <key>inetdCompatibility</key>
    <dict>
        <key>Wait</key>
        <false/>
    </dict>
    <key>StandardErrorPath</key>
    <string>/var/log/sshd-7.1.log</string>
    <key>SHAuthorizationRight</key>
    <string>system.preferences</string>
</dict>
</plist>

Há algumas coisas acontecendo no problema:

  • o rótulo de serviço foi alterado para com.openssh.sshd.7-1 para evitar colisões com com.openssh.sshd da Apple
  • o arquivo PID foi alterado para var/run/sshd-7.1.pid para evitar colisões com var/run/sshd.pid da Apple
  • o caminho absoluto do programa foi incluído em ProgramArguments devido a um sshd re-exec requires execution with an absolute path ao atender conexões de clientes
  • sshd_config é chamado especificamente para evitar perguntas abertas e confusão. Mas é usado por padrão
  • o uso da opção - i mesmo que seja uma inetd(8) opção. De acordo com a opção sshd e -i no OS X , ele deve ser usado

Inicie o novo serviço SSH

Use o launchd para iniciar o serviço. Observe o uso de -w para evitar a mensagem de erro "nada encontrado para carregar" porque o serviço está desativado.

$ sudo launchctl load -w /System/Library/LaunchDaemons/ssh-7.1.plist

Por fim, verifique se o novo servidor SSH está funcionando:

$ netstat -an | grep 1522
tcp6       0      0  *.1522                 *.*                    LISTEN     
tcp4       0      0  *.1522                 *.*                    LISTEN  
    
por 23.08.2015 / 09:26
1

I visited openssh.com and fetched the latest version (7.1) via FTP.

O link em "Para o OpenBSD: FTP / HTTP" é, como o nome diz, somente para o OpenBSD . Ele precisa ser construído usando as ferramentas 'Portas' do OpenBSD.

Como você está executando o OS X, não o OpenBSD, você terá que baixá-lo de "Para outros sistemas operacionais → Outros…". (Role para baixo até a seção "Download".) O tarball oficial do 7.1p1 OpenSSH definitivamente tem um script configure e um documento INSTALL .

Vinculação estática não deve ser necessária; Os binários do OS X podem dependem de bibliotecas em um caminho absoluto. (Acho que pode até ser o padrão?)

There is no download link on the homepage; you kinda have to rummage for it.

Concordo que o site está meio que preso nos anos 90, mas eu não diria dois cliques em vez de uma contagem como remexer ... Se tivesse uma página de download, ela conteria apenas os mesmos links de SO < em> já na barra lateral, não é?

Where do I find the instructions?

Dê uma olhada no Homebrew, especialmente em sua fórmula openssh . Além disso:

por 23.08.2015 / 03:42