У меня на OS X 10.5 PowerMac (PowerPC) я использую для тестирования. Apple отказалась от поддержки этого. Другие хотят получить доступ к коробке для тестирования, поэтому мне нужно собрать и установить обновленный OpenSSH.

Я посетил openssh.com и получил последнюю версию (7.1) по FTP. Ссылка в левой боковой панели. На главной странице нет ссылки на скачивание; Вы вроде должны искать это.

К сожалению, похоже, что в OpenSSH нет документации по этому процессу. Это не configure (поэтому не configure --help), нет установки, и нет темы по этому вопросу в FAQ по OpenSSH.

Существует README, которая указывает мне на http://www.openssh.com/portable.html. К сожалению, это не обеспечивает инструкции по сборке. Интересно, что в нем говорится как о configure и об autoreconf , которых нет в tarball.

Мне нужно использовать обновленную версию OpenSSL. OpenSSL 1.0.2d был собран и установлен в /usr/local . Мне также необходимо обеспечить статическую связь OpenSSH с альтернативным OpenSSL, чтобы он не использовал версию OpenSSL 0.9.8 нижнего уровня, предоставленную Apple.

Как мне собрать OpenSSH, используя обновленный OpenSSL на OS X? Где я могу найти инструкции?

2 ответа2

2

Как мне собрать OpenSSH, используя обновленный OpenSSL на OS X? Где я могу найти инструкции?

Гравитация была правильной - я загрузил не тот OpenSSH. Мне нужен был портативный, а не тот, который указан на FTP-ссылке. Портативные перечислены в нижней части Portable OpenSSH.

Когда у вас есть портативный, распакуйте, а затем выполните следующее. Далее предполагается, что у вас есть обновленный OpenSSL libcrypto установленный в /usr/local/ssl/darwin и обновленный Zlib libz в /usr/local . Настройте их по своему вкусу.

Замените -lz абсолютным путем к архиву

Это необходимо для обеспечения статического связывания, поскольку для него нет явной опции в configure . Когда двоичный файл собран , otool -L покажет, что внешних зависимостей 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"

Затем:

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

Замените -lcrypto абсолютным путем к архиву

Это необходимо для обеспечения статического связывания, поскольку для него нет явной опции в configure . Когда двоичный файл собран , otool -L покажет, что нет внешних зависимостей OpenSSL.

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

Затем:

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

Выше я использую /usr/local/ssl/darwin качестве --openssldir при сборке библиотеки OpenSSL. Обычно это просто /usr/local/ssl . Отрегулируйте его по мере необходимости.

Настроить OpenSSH

Настройте OpenSSH с необходимыми путями. Возможно, вам придется включить библиотеку OS X, тоже.

Если find /usr/lib/ -name libsandbox* возвращает libsandbox.dylib , вам нужно включить --with-libs="-lsandbox . Его нет в OS X 10.5, но он присутствует в OS X 10.8. Если библиотека присутствует, но --with-libs опущена, то это приведет к ошибке, подобной 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

Вам может понадобиться --with-pam чтобы заставить работать аутентификацию по паролю. Я не был заинтересован в этой функции, поэтому я не добавил опцию конфигурации.

Сборка и установка OpenSSH

-fwrapv вызывает некоторое беспокойство, когда рассматривается в программном обеспечении высокой целостности. Это обычно означает, что есть нелегальная программа на C с неопределенным поведением в движении. Разработчики не исправили это, поэтому они используют -fwrapv как помощник.

$ 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
...

Внешние зависимости (или их отсутствие) можно проверить с помощью:

$ 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)

К сожалению, нет ни make check ни make test целей тестирования , поэтому нет очевидного способа проверить программное обеспечение перед его установкой.

$ 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 root@riemann.home.dmz
The key's randomart image is:
+--[ED25519 256]--+
| .ooooo.o .      |
| o.o=o+. B o     |
|  o..B .+.=      |
|    . * E...     |
|   . . *So.      |
|    + . +=       |
|   . o =*o       |
|    . .+B+       |
|       +=..      |
+----[SHA256]-----+
...

Создать Plist для нового двоичного файла SSH

Далее используется существующий ssh.plist , удаляется сценарий оболочки Apple и изменяется номер порта. Скопируйте его в /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>

В листе происходит несколько вещей:

  • метка сервиса была изменена на com.openssh.sshd.7-1 чтобы избежать столкновения с com.openssh.sshd Apple
  • файл PID был изменен на var/run/sshd-7.1.pid чтобы избежать столкновения с Apple var/run/sshd.pid
  • абсолютный путь к программе был включен в ProgramArguments поскольку sshd re-exec requires execution with an absolute path при обслуживании клиентских соединений
  • sshd_config вызывается специально, чтобы избежать открытых вопросов и путаницы. Но это используется по умолчанию
  • использование опции - i даже если это опция inetd(8) . Согласно опции sshd и -i на OS X, он должен использоваться

Запустите новый сервис SSH

Используйте launchd для запуска сервиса. Обратите внимание на использование -w чтобы избежать сообщения об ошибке "ничего не найдено для загрузки", поскольку служба отключена.

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

Наконец, убедитесь, что новый сервер SSH работает:

$ netstat -an | grep 1522
tcp6       0      0  *.1522                 *.*                    LISTEN     
tcp4       0      0  *.1522                 *.*                    LISTEN  
1

Я посетил openssh.com и получил последнюю версию (7.1) по FTP.

Ссылка в разделе «Для OpenBSD: FTP / HTTP», как следует из названия, предназначена только для OpenBSD. Он должен быть собран с использованием инструментов «Порты» OpenBSD.

Поскольку вы работаете с OS X, а не с OpenBSD, вам придется скачать его с «Для других ОС → Другие…». (Прокрутите вниз до раздела "Скачать".) В официальном архиве OpenSSH-portable 7.1p1 определенно есть скрипт configure и документ INSTALL .

Статическое связывание не должно быть необходимым; Двоичные файлы OS X могут зависеть от библиотек по абсолютному пути. (Я думаю, что это может быть даже по умолчанию?)

На главной странице нет ссылки на скачивание; Вы вроде должны искать это.

Я согласен, что сайт застрял в 1990-х годах, но я бы не сказал, что два клика вместо одного считаются рыться ... Если бы у него была страница загрузки, она бы просто содержала те же ссылки ОС, которые уже есть на боковой панели, не так ли?

Где я могу найти инструкции?

Взгляните на Homebrew, особенно его формулу openssh. Также:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .