Как мне собрать 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