Capistrano тонкий nginx с пользователем, которому не разрешено судо как?

#ruby-on-rails #nginx #capistrano #thin

Вопрос:

У меня есть подобный сценарий, который я хочу использовать в capistrano для развертывания моего приложения ruby on rails:

  1. Веб-приложение находится в узком кластере, файл конфигурации которого хранится в файле /etc/thin. кроме того, сценарий инициализации находится в файле /etc/init.d/thin, поэтому он будет запускаться автоматически всякий раз, когда моему серверу потребуется перезагрузка
  2. Также nginx выполняется таким же образом (как демон сценария инициализации)
  3. Чтобы убедиться, что в случае, если кто-то взломал мой веб-сервер, я не хочу, чтобы они сделали что-то слишком ужасное, поэтому веб-пользователю не разрешается судиться.
  4. Thin и nginx работают как веб-пользователи для обеспечения такой безопасности

Теперь, когда мне нужно выполнить развертывание, мне понадобятся файлы, которые будут установлены в /home/webuser/railsapps/helloworld, и мне нужно, чтобы сценарий cap перезапустил мой thin после этого. Я хочу сохранить все файлы, принадлежащие веб-пользователю, поэтому основной пользователь сценария cap работает как веб-пользователь. Теперь проблема возникает, когда я хочу перезапустить тонкий демон, потому что веб-пользователь не может выполнить sudo.

Я думаю, можно ли вызвать два отдельных сеанса — webuser для развертывания файлов, а затем специальный sudoer для перезапуска демона. Кто-нибудь может дать мне пример сценария на этот счет?

Ответ №1:

Возможно, это не то, что вы хотите, но вы действительно можете сделать что-то подобное в своем файле sudoers:

 someuser ALL=NOPASSWD: /etc/init.d/apache2
 

это позволяет некоторым пользователям запускать /etc/init.d/apache2

Если вы попытаетесь сделать что-то еще:

 $ sudo ls
[sudo] password for someuser: 
Sorry, user someuser is not allowed to execute '/bin/ls' as root on ...
 

Комментарии:

1. На самом деле это звучит хорошим обходным путем 🙂 мы посмотрим, есть ли что-то еще более мощное 🙂

Ответ №2:

почему бы не использовать sudo для процедуры развертывания, а затем chown-R в руте RAILS_? Вы могли бы попросить Capistrano сменить владельца до того, как переименовать выпуск в текущий.

Ответ №3:

Альтернативой этому может быть запуск nginx как обычного пользователя, скажем, на порту 8080, а затем использование IPTables для перенаправления запросов с порта 80 на порт 8080 из памяти

iptables -ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ-t tcp -m tcp -p 80 -j DNAT --dport 8080

Отправит все пакеты, предназначенные для порта 80, на порт 8080, который может быть привязан как обычный пользователь.

Ответ №4:

Если вы работаете в качестве веб-пользователя, то может ли веб-пользователь не завершить процесс? Вы можете снова перезапустить Thin без демона, пока вы передаете серверу все в /etc/thin, все должно быть в порядке. Демон, насколько я понимаю, — это просто удобный способ обойти необходимость ручного запуска программы при загрузке.

Единственный раз, когда вы отклеитесь, — это когда вам придется редактировать содержимое файла /etc/thin. Предполагая, что вы используете псевдонимы для своего веб-пользователя.биты yml, это произойдет только тогда, когда вы захотите добавить / удалить программу. Когда это произойдет, возможно, стоит просто вручную добавить/удалить псевдоним.

Все это при условии, что веб-пользователь может завершить тонкий процесс для начала. Я не знаю другого. В последний раз это было проблемой для меня, когда у меня не было возможности запустить приложение на моем локальном компьютере, потому что его реализация была в значительной степени привязана к макету сервера. Каждый раз, когда я что-то редактировал, мне приходилось отправлять это в SVN, переключать вкладки в терминале на оболочку ssh, извлекать его из SVN, переключать вкладки на другой ssh и перезапускать демона и проверять, не сломал ли я его. Это меня расстроило, поэтому я установил Thin локально, получил приложение для чтения файлов конфигурации, и теперь мне нужно загружать их только раз в несколько дней.

Ответ №5:

Просто заметил, что вы не разрешаете пользователю sudo 🙂 Ну, этот ответ поможет другим:

Немного опоздал на вечеринку, но я только что сделал это:

 namespace :deploy do
  desc "Start the Thin processes"
    task :start do
      run "cd #{current_path} amp;amp; bundle exec sudo thin start -C /etc/thin/dankit.yml"
    end

    desc "Stop the Thin processes"
    task :stop do
      run "cd #{current_path} amp;amp; bundle exec sudo thin stop -C /etc/thin/dankit.yml"
    end

    desc "Restart the Thin processes"
    task :restart do
      run "cd #{current_path} amp;amp; bundle exec sudo thin restart -C /etc/thin/dankit.yml"
    end

end
 

Добавление sudo в bundle exec sudo thin start работу.