Лучшие практики при запуске Node.js с портом 80 (Ubuntu / Linode) [закрыто]

260

Я настраиваю свой первый Node.jsсервер на, cloud Linux nodeи я довольно плохо знаком с деталями Linux admin. (Кстати, я не пытаюсь использовать Apache одновременно.)

Все установлено правильно, но я обнаружил, что, если я не использую root login, я не могу слушать port 80с узла. Однако я бы не хотел запускать его как root по соображениям безопасности.

Какова лучшая практика для:

  1. Установить хорошие права доступа / пользователя для узла, чтобы он был безопасным / изолированным?
  2. Разрешить использование порта 80 в рамках этих ограничений.
  3. Запустите узел и запустите его автоматически.
  4. Обработка информации журнала, отправленной на консоль.
  5. Любые другие вопросы общего обслуживания и безопасности.

Должен ли я перенаправлять трафик порта 80 на другой порт прослушивания?

Спасибо

Robotbugs
источник

Ответы:

532

Порт 80

На моих экземплярах в облаке я перенаправляю порт 80 на порт 3000 с помощью этой команды:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

Затем я запускаю свой Node.js на порту 3000. Запросы на порт 80 будут сопоставлены с портом 3000.

Вы также должны отредактировать ваш /etc/rc.localфайл и добавить эту строку минус sudo. Это добавит перенаправление при загрузке машины. Вам не нужно sudoв /etc/rc.localпотому , что команды там работают как rootпри загрузке системы.

бревна

Используйте модуль forever для запуска вашего Node.js с. Он удостоверится, что перезапустится, если произойдет сбой, и перенаправит журналы консоли в файл.

Запустить при загрузке

Добавьте ваш Node.js запустить скрипт в файл вы редактировали для перенаправления портов, /etc/rc.local. Это запустит ваш скрипт запуска Node.js при запуске системы.

Digital Ocean и другие VPS

Это относится не только к Linode, но и к Digital Ocean, AWS EC2 и другим VPS-провайдерам. Тем не менее, на основе систем RedHat /etc/rc.localесть /ect/rc.d/local.

Даниил
источник
3
Спасибо за этот ответ, приятно и по существу.
Robotbugs
21
Кстати, на Ubuntu это /etc/rc.local
kehers
12
Часто флаг "-i eth0" будет проблемой для виртуальных частных серверов. Замените eth0 при необходимости.
JHAWN
7
Если я добавлю свой стартовый скрипт Node.js /etc/rc.local, не будет ли он выполняться как rootпри загрузке системы? Это победило бы цель перенаправления порта 80.
jamix
4
Обратите внимание, что для перенаправления порта на работу, порт назначения также должен быть открыт на вашем брандмауэре. WRT, запускающий экземпляр узла при загрузке, мы просто используем сценарии инициализации дистрибутива / файлы systemd, которые позволяют вам указать пользователя.
bk138
116

Дайте безопасное пользовательское разрешение на использование порта 80

Помните, мы НЕ хотим запускать ваши приложения от имени пользователя root, но есть загвоздка: ваш безопасный пользователь не имеет разрешения использовать порт HTTP по умолчанию (80). Ваша цель - иметь возможность публиковать веб-сайт, который могут использовать посетители, перейдя по такому простому URL-адресу, какhttp://ip:port/

К сожалению, если вы не войдете в систему как root, вам обычно придется использовать URL-адрес, например, http://ip:portгде номер порта> 1024.

Многие люди застряли здесь, но решение легко. Там несколько вариантов, но это тот, который мне нравится. Введите следующие команды:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Теперь, когда вы сообщаете приложению Node, что хотите, чтобы оно работало на порту 80, оно не будет жаловаться.

Проверьте эту ссылку ссылку

Познакомьтесь с Мехтой
источник
9
Это лучший, более простой ответ.
Кайл Чадха
2
Также здесь добавлен подробный ответ stackoverflow.com/questions/23281895/…
Познакомьтесь с Мехтой
1
Как веб-сервер, такой как NGINX, работает на порту 80? Это делает что-то подобное?
Эрик Эндрю Льюис
1
@EricAndrewLewis: я скажу, что это зависит. Эта ошибка будет отображаться при работе сервера в режиме без полномочий root. Что делать, если вы используете сервер Nginx от имени пользователя root! Также, если вы работаете как обычный пользователь и получаете ошибку. Запустите указанные выше команды, чтобы получить безопасные разрешения на доступ к порту. Также обратитесь к stackoverflow.com/questions/31369480/…
Познакомьтесь с Мехтой
16

Отбросьте привилегии root после привязки к порту 80 (или 443).

Это позволяет порту 80/443 оставаться защищенным, в то же время не позволяя обслуживать запросы от имени root:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

Полный рабочий пример с использованием вышеуказанной функции:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

Подробности смотрите в этом полном справочнике .

slund
источник
9

Для порта 80 (который был первоначальный вопрос), Даниэль совершенно прав. Недавно я перешел на httpsи должен был переключиться iptablesна легкий прокси-сервер nginx, управляющий сертификатами SSL. Я нашел полезный ответ вместе с сутью по gabrielhpugliese о том , как справиться с этим. В основном я

Надеюсь, что это может спасти кого-то еще от некоторых головных болей. Я уверен, что есть способ сделать это на чистом узле, но nginx был быстрым и сработал.

Ник Бенес
источник