2

Поэтому я хотел запустить Node-сервер на порту 80, но я не хотел запускать весь процесс с правами суперпользователя, для безопасности я думал, что это будет лучше всего.

Поэтому я подумал, что хорошим решением было бы использовать от имени root:

su - (myuser) -c 'скрипт для запуска навсегда'

Тем не менее, я получаю ошибки EACCESS, но запуск сценария напрямую от имени root - это нормально. Я слышу, как другие делают то же самое и работают на них, так может ли быть, что я делаю что-то другое?

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

3 ответа3

3

да, могу это сделать. см. этот пост в блоге, который объясняет лучше, чем я.

https://thomashunter.name/blog/drop-root-privileges-in-node-js/

Я копирую соответствующий код здесь на случай, если блог станет недоступным

app.listen(80, 'localhost', null, function() {
  // Listening
  try {
    console.log('Old User ID: ' + process.getuid() + ', Old Group ID: ' + process.getgid());
    process.setgid('users');
    process.setuid('tlhunter');
    console.log('New User ID: ' + process.getuid() + ', New Group ID: ' + process.getgid());
  } catch (err) {
    console.log('Cowardly refusing to keep the process alive as root.');
    process.exit(1);
  }
});
2

su - <user> переключается на <user> прежде чем делать что-либо еще, поэтому сервер NodeJS будет запущен как ваш пользователь и не будет иметь никакого представления о том, что root запускает команду su , и поскольку пользователям не разрешено использовать привилегированные порты это никогда не сработает.

Есть два способа обойти это, что я могу придумать из головы:

  1. Использование файловой возможности , которая позволит непривилегированным пользователям открывать привилегированные порты. Хотя они обычно не работают над сценариями, в этом случае они должны, так как, насколько я знаю, вы запускаете сервер, используя node <filename> . (Поправь меня, если я ошибаюсь.)

  2. Использование обратного прокси-сервера, такого как NGINX, который находится перед сервером приложений и работает от имени пользователя root. В этом случае пользователи подключаются напрямую к NGINX, который затем проксирует соединения с сервером приложений, но позволяет легче запускать несколько серверов / экземпляров и позволяет кешировать ресурсы NGINX. Это обычно является предпочтительным подходом к развертыванию серверов приложений.

0

Если вы используете Gnu/Linux, вы можете использовать возможности, чтобы дать приложению возможность открывать привилегированные порты, и никаких других возможностей (root предоставляет все возможности).

Смотрите здесь для очень простого введения https://unix.stackexchange.com/questions/101263/what-are-the-different-ways-to-set-file-permissions-etc-on-gnu-linux

[edit:] Необходимая возможность GNU/Linux - cap_net_bind_service. В Solaris используйте PRIV_NET_PRIVADDR. Для получения более подробной информации см. Man functions (7) (Linux) или man привилегии (5) (Solaris).

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