it-консалтинг и аутсорсинг
что мы делаем контакты блог

Software Update Server против HTTP-прокси

Василий Колосов 03.06.2011

Stolichnaya Reposado

У одного из наших клиентов, на род деятельности которого опасно даже намекать, всегда были повышенные требования к безопасности. Помимо наличия целого каскада фаерволов, драконовских политик безопасности и постоянных проверок рабочего персонала, присутствовало еще одно неудобство: все находящиеся в нашей юрисдикции серверы не имели прямого доступа в интернет, а должны были использовать HTTP-прокси, с которым родной Software Update Server работать не умеет.
Естественно, установка обновлений на все три сотни машин превращалась в головную боль. И когда мы узнали, что системные администраторы Walt Disney Animation Studios написали альтернативный сервер обновлений Mac OS X с загадочным названием Reposado, то решили попробовать его при первой же возможности.

Reposado написан на Python и, как следствие, является кроссплатформенным решением. Для его работы нужен только веб-сервер, утилита curl и около 30 Гб свободного места на диске.

Установка и начальная конфигурация

Скачиваем последнюю версию:
$ git clone git://github.com/wdas/reposado.git
Запускаем установщик:
$ cd reposado/
$ sudo python setup.py install
Теперь нужно выполнить первичную конфигурацию при помощи скрипта repoutil, который попросит задать путь к каталогу для хранения обновлений, каталогу с метаданными и указать адрес веб-сервера:
$ repoutil –configure
Path to store replicated catalogs and updates [None]: /var/reposado/html
Path to store Reposado metadata [None]: /var/reposado/meta
Base URL for your local Software Update Service
(Example: http://su.your.org — leave empty if you are not replicating updates) [None]: http://macupdate.kremlin.ru:8088
WARNING: UpdatesRootDir “/var/reposado/html” does not exist. Will attempt to create it.
WARNING: UpdatesMetadataDir “/var/reposado/meta” does not exist. Will attempt to create it.

Настройка прокси-сервера

Свою конфигурацию reposado сохраняет в файле preferences.plist, который располагается в каталоге /Library/Python/2.6/site-packages/. Выглядеть он будет приблизительно так:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple Computer//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dt”>
<plist version=”1.0″>
<dict>
<key>LocalCatalogURLBase</key>
<string> http://macupdate.kremlin.ru:8088</string>
<key>UpdatesMetadataDir</key>
<string> /var/reposado/meta </string>
<key>UpdatesRootDir</key>
<string> /var/reposado/html</string>
</dict>
</plist>
При помощи параметра AdditionalCurlOptions можно задать дополнительные параметры для curl. Нас, конечно, интересует возможность указать адрес прокси-сервера и данные для аутентификации на нем, например:
<key>AdditionalCurlOptions</key>
<array>
<string>proxy = “proxy.kremlin.ru:3128″</string>
<string>user = “admin:lenin123”</string>
</array>

Синхронизация обновлений

Теперь стоит выполнить первую синхронизацию каталога и проверить, что все работает нормально:
$ repo_sync
Downloading 871235 bytes from http://swscan.apple.com/content/catalogs/index.sucatalog…
В дальнейшем проще настроить ее периодическое выполнение по расписанию. Для этого достаточно создать элемент launchd (например, ru.shortcut.reposync.plist) и поместить его в каталог /Library/LaunchDaemons. Сам plist-файл может выглядеть, например, так:
<?xml version=’1.0′ encoding=’UTF-8′?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version=’1.0′>
<dict>
<key>Label</key><string>ru.shortcut.reposync</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/repo_sync</string>
</array>
<key>UserName</key>
<string>root</string>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>8</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</dict>
</plist>
Остается загрузить его в launchd:
$ sudo launchctl load /Library/LaunchDaemons/ru.shortcut.reposync.plist

Настройка веб-сервера

В Server Admin на вкладке Sites панели управления веб-сервером добавляем новый сайт, задаем Host Name (например, macupdate.kremlin.ru), описание (по вкусу), порт (стандартный Software Update Server использует 8088) и указываем в качестве корневой папки (Web Folder) путь к каталогу обновлений Reposado (в нашем примере это /var/reposado/html).

Skolkovo14-56

 

Настройка клиентов

Как и в случае со стандартным Software Update Server, мы задаем путь к каталогу  обновлений в параметре CatalogURL файла настроек com.apple.SoftwareUpdate.plist.   Для этого мы можем использовать Managed Preferences в Workgroup Manager или редактировать его напрямую, например, командой defaults (для 10.6):
defaults write /Library/Preferences/com.apple.SoftwareUpdate CatalogURL http://macupdate.kremlin.ru:8088/content/catalogs/others/index-leopard-snowleopard.merged-1.sucatalog
На компьютерах с 10.5 следует заменить index-leopard-snowleopard.merged-1.sucatalog на index-leopard.merged-1.sucatalog:
defaults write /Library/Preferences/com.apple.SoftwareUpdate CatalogURL http://macupdate.kremlin.ru:8088/content/catalogs/others/index-leopard.merged-1.sucatalog
Через Send UNIX Command в ARD можно выполнить эту команду сразу на всех  компьютерах. После этого остается только запустить softwareupdate -l и убедиться в правильной работе сервера.

И не только

Конечно, Reposado — это больше, чем спасение от HTTP-прокси. При помощи repoutil можно создавать свои «ветви» каталогов и предоставлять разным клиентам разный набор обновлений. Удобно, к примеру, выделить несколько тестовых компьютеров для «обкатки» только что вышедших патчей. Еще один сценарий: сервер с 10.5 (или даже 10.4!) и наличие клиентов с более новой версией Mac OS X. Reposado, в отличие от заводского Software Update Server, будет предоставлять обновления всем желающим.

  • Даша

    “…использовать HTTP-прокси, с которым родной Software Update Server работать не умеет.” – умеет, умеет.
    Открываем /System/Library/LaunchDaemons/com.apple.swupdate.sync.plist и добавляем, например, для прокси 192.168.1.1:8000:

    
    <key>EnvironmentVariables</key>
    <dict>
    <key>http_proxy</key>
    <string>http://10.0.0.5:8000</string>
    </dict>
    

    Согласитесь, это чуть проще. Хотя возможность установки обновлений для клиентов 10.6 с сервера 10.5 в данном случае бесценно.
    P.S. если контора действительно такая серьезная, то могли бы себе позволить поставить выделенный SUS в DMZ.

  • Даша

    мой текст после отправки был изменен до неузнаваемости (((((
    можно его как-нибудь вернуть в исходное состояние или мне прислать фрагмент xml заново?

  • > Согласитесь, это чуть проще.

    Если нет аутентификации — то, конечно, да.

  • Даша

    Механизм аутентификации не указан, поэтому здесь мне сложно что-нибудь сказать. Но аутентификация прописанная в plist для серьезной конторы – мягко говоря спорное решение.

    Как можно решить вопрос, чтобы привести фрагмент xml-файла к его естественному виду?

  • Главное в Reposado – отсутствие оккультных глюков “родного” Software Update Server.

  • Даша

    “да вы все тут молодцы” (с)
    игнорировать вопросы – вы этому у этого клиента научились?

  • Даша

    [key]EnvironmentVariables[/key]

    [dict]

    [key]http_proxy[/key]

    [string]http://10.0.0.5:8000[/string]

    [/dict]

    можно это вставить в мой первый пост, заменив скобочки на правильные уголки?

  • Даша

    “Главное в Reposado – отсутствие оккультных глюков” – это серьезно? Или как с http-proxy?
    На самом деле SUS это как член длиною в метр – насколько круто, настолько бесполезно. Ответственные администраторы ставят апробированные пакеты обновлений вручную через ARD. Либо сразу, либо через Task Server.

    Ваша Даша.

  • Александр

    Кирилл, привет! Весело тут у вас )))
    Поддержу про оккультные глюки – вещь глубоко в себе. Как впрочем и некоторые другие службы сервера.

    Василий, про атуентификацию. Решается строчкой типа
    http://username:password@proxy.mycompany.com:8080.
    Либо поставить в автозагрузку Authoxy.

  • > Решается строчкой типа http://username:password@proxy.mycompany.com:8080

    Неужто SUS умеет парсить такие URL? Обязательно попробую!

    > Ответственные администраторы ставят апробированные пакеты обновлений вручную через ARD.

    Что мешает ответственному администратору отправить команду softwareupdate -i -a через тот же ARD для установки апробированных пакетов?

  • Александр

    А что тут парсить? Это стандартный http-запрос с авторизацией согласно RFC 2616.

  • Даша, так можно же в стандартном SUS 10.6 разрешать/запрещать конкретные пакеты.
    Чтоб дополнить/расширить обсуждение SUS – ссылочка на опыты с допиливанием SUS: http://proturbo.kiev.ua/forum/viewtopic.php?f=4&t=478&p=1033&hilit=sus&sid=0ba7c92ed255e11f14e708306fc6c787#p1033

  • > Это стандартный http-запрос с авторизацией согласно RFC 2616.

    Вот прямо сейчас попробовал указать логин и пароль в URL — swupd_syncd просто игнорирует параметр http_proxy и соединяется напрямую. Разумеется, проверял после выгрузки и повторной загрузки com.apple.swupdate.sync.plist.

  • Даша

    О! Уголочки поправили! Спасибо большое, извините за несдержанность – не умею долго ждать. Только там с ip-адресом прокси-сервера теперь лажа какая-то вылезл, ну да ладно. Думаю всем все и так понятно.

    Уважаемый Василий! Честно говоря, я не знаю, что им мешает.
    Уважаемый Сахар! Спасибо за ссылку. Мне не актуально, но, уверена, многим она будет полезна. Про возможность отключать пакеты для всех я знаю. Я не знаю другой возможности фильтрации конкретных пакетов для конкретных компьютеров-пользователей. У кого-то стоят программы или аппаратные
    средства третьих фирм, несовместимые с какими-либо обновлениями. Но это же не значит, что их вообще никак не обновлять или не ставить эти обновления вообще никому?

  • Александр

    Василий, а без логина и пароля в URL работает?

  • Александр, без пароля все еще веселее:

    : sync failed with NSInvalidArgumentException: *** -[NSURL initWithString:relativeToURL:]: nil string parameter

    При этом, разумеется, анонимный доступ включен и нормально работает. Кстати, есть вот такая статья в базе знаний Apple:

    http://support.apple.com/kb/TS3099

    В секции Additional Information рассказывается, как удалить из файла com.apple.swupdate.sync.plist параметр http_proxy, если он использовался в версиях Mac OS X Server 10.6.0-10.6.2 для работы SUS через прокси. К чему бы это?

  • Александр

    Не знаю. Я только предложил два известных мне проверенных в других ситуациях способа аутентификации на http-proxy.

  • Александр

    Прочитал статью. А предлагаемое Apple решение не работает?

  • Rost

    Для меня основной плюс reposado в том, что для его работы не нужен Mac OS X Server.

  • Раду

    > Главное в Reposado – отсутствие оккультных глюков “родного” Software Update Server

    За Reposado спасибо, но я чуть не в тему.
    Можно пож-ста поподробнее про глюки “родного”! Пользую его много и в большом количестве, но глюков не наблюдаю… Может я его неправильно настроил? (хотя и не настраивал – просто, как нынче модно говорить “Just works”)

    Раду

  • Конечно было неуместно в блоге написать про “оккультные глюки”, назовем их “тонкости в эксплуатации”.

    Доводилось сталкиваться с
    – не качает обновления
    – не качает обновления так быстро как хотелось бы, попытка закачать вручную через Server Admin успехом не оборачивается (ignored invalid download request for product)
    – клиенты ничего не находят
    – прочее
    Все это можно найти на Apple Discussions.

    Но в основном, ты прав, если его запустить, разрешить скачивать все обновления и ничего не трогать, все работает.