Советы и рекомендации по защите вашего веб-сервера Nginx
На этой странице
- Требования
- Установите Nginx
- Обновление Nginx
- Предотвращение раскрытия информации
- Ограничить доступ к IP-адресам
- Защитите Nginx с помощью TLS
- Защитите каталог паролем
Nginx — это легкий, высокопроизводительный и самый быстрорастущий веб-сервер с открытым исходным кодом в мире. Nginx работает в операционных системах Linux, Windows, Mac OS и Solaris. Популярность NGINX продолжает расти, а это означает, что все больше и больше развертываний NGINX необходимо защищать.
В этом руководстве мы объясним некоторые популярные советы и рекомендации по безопасности сервера Nginx.
Требования
- Сервер под управлением Ubuntu 18.04 или Debian 9.
- На вашем сервере установлен пароль root.
Установите Nginx
Во-первых, вам нужно будет установить Nginx в вашу систему. Вы можете установить его, выполнив следующую команду:
apt-get install nginx -y
После установки Nginx вы можете проверить статус Nginx с помощью следующей команды:
systemctl status nginx
Вы должны увидеть следующий вывод:
? nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2019-03-10 02:43:14 UTC; 4min 40s ago Docs: man:nginx(8) Process: 2271 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Process: 2281 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 2274 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 2285 (nginx) Tasks: 2 (limit: 1111) CGroup: /system.slice/nginx.service ??2285 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; ??2290 nginx: worker process Mar 10 02:43:14 ubuntu1804 systemd[1]: Starting A high performance web server and a reverse proxy server... Mar 10 02:43:14 ubuntu1804 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument Mar 10 02:43:14 ubuntu1804 systemd[1]: Started A high performance web server and a reverse proxy server.
Обновить Nginx
Вам нужно будет обновить веб-сервер Nginx, так как в него добавлено множество улучшений производительности, новых функций и исправлений безопасности. Большинство современных дистрибутивов Linux не включают последнюю версию nginx в свои списки пакетов по умолчанию. Поэтому вам нужно будет обновить последнюю версию nginx через менеджер пакетов. Вы можете обновить свой веб-сервер Nginx с помощью следующей команды:
apt-get update -y
apt-get install nginx --reinstall -y
Предотвращение раскрытия информации
Во-первых, вам нужно запретить Nginx раскрывать информацию о своей версии.
По умолчанию Nginx показывает свое имя и версию в заголовках HTTP.
Вы можете проверить это с помощью следующей команды:
curl -I http://localhost
Вы должны увидеть следующий вывод:
HTTP/1.1 200 OK Server: nginx/1.14.0 (Ubuntu) Date: Sat, 09 Mar 2019 15:28:01 GMT Content-Type: text/html Content-Length: 10918 Last-Modified: Fri, 01 Feb 2019 16:05:17 GMT Connection: keep-alive ETag: "5c546e3d-2aa6" Accept-Ranges: bytes
В приведенном выше выводе вы должны увидеть версию Nginx и операционной системы.
Вы можете скрыть эту информацию, отредактировав файл /etc/nginx/nginx.conf:
nano /etc/nginx/nginx.conf
Добавьте автономную строку server_tokens внутри части конфигурации http:
http { ## # Basic Settings ## server_tokens off;
Сохраните и закройте файл, когда закончите. Затем перезапустите веб-сервер Nginx, чтобы применить изменения:
systemctl restart nginx
Теперь снова запустите команду curl:
curl -I http://localhost
Вы должны увидеть следующий вывод:
HTTP/1.1 200 OK Server: nginx Date: Sat, 09 Mar 2019 15:33:31 GMT Content-Type: text/html Content-Length: 10918 Last-Modified: Fri, 01 Feb 2019 16:05:17 GMT Connection: keep-alive ETag: "5c546e3d-2aa6" Accept-Ranges: bytes
Ограничить IP-адреса из доступа
Nginx поставляется с простым модулем ngx_http_access_module, который позволяет разрешить или запретить определенный IP-адрес.
Если вы хотите разрешить Nginx создать 172.16.0.0/16 и запретить из других подсетей. Затем откройте файл /etc/nginx/sites-enabled/default:
nano /etc/nginx/sites-enabled/default
Внесите следующие изменения внутри блока server:
server { listen 80 default_server; listen [::]:80 default_server; allow 172.16.0.0/16; deny all;
Сохраните и закройте файл, когда закончите. Затем перезапустите Nginx, чтобы применить эти изменения:
systemctl restart nginx
Теперь попробуйте получить доступ к вашему серверу Nginx с другого диапазона IP-адресов, например 192.168.0.102.
Затем проверьте журнал Nginx с помощью следующей команды:
tail -f /var/log/nginx/error.log
Вы должны получить запрет на доступ в следующем выводе:
2019/03/09 16:13:01 [error] 11589#11589: *1 access forbidden by rule, client: 192.168.0.102, server: _, request: "GET /test/ HTTP/1.1", host: "172.16.0.122"
Защитите Nginx с помощью TLS
TLS (Transport Layer Security) является преемником SSL (Secure Socket Layer). Он обеспечивает более надежный и эффективный HTTPS и содержит больше улучшений, таких как Forward Secrecy, совместимость с современными наборами шифров OpenSSL и HSTS. В этом руководстве показано, как включить самозаверяющий сертификат SSL в Nginx. Если вместо этого вы хотите использовать сертификат Lets Encrypt, загляните сюда: https://linux-console.net/tutorial/nginx-with-letsencrypt-ciphersuite/
Сначала создайте каталог для SSL с помощью следующей команды:
mkdir /etc/nginx/ssl/
Затем сгенерируйте ключ и сертификат с помощью следующей команды:
cd /etc/nginx/ssl/
Сначала сгенерируйте ключ с помощью следующей команды:
openssl genrsa -aes256 -out nginx.key 1024
Вы должны увидеть следующий вывод:
Generating RSA private key, 1024 bit long modulus ...++++++ .............................++++++ e is 65537 (0x010001) Enter pass phrase for nginx.key: Verifying - Enter pass phrase for nginx.key:
Затем сгенерируйте csr с помощью следующей команды:
openssl req -new -key nginx.key -out nginx.csr
Предоставьте всю информацию, как показано ниже:
Generating RSA private key, 1024 bit long modulus ...++++++ .............................++++++ e is 65537 (0x010001) Enter pass phrase for nginx.key: Verifying - Enter pass phrase for nginx.key: :~# openssl req -new -key nginx.key -out nginx.csr Enter pass phrase for nginx.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:IN State or Province Name (full name) [Some-State]:Gujarat Locality Name (eg, city) []:Junagadh Organization Name (eg, company) [Internet Widgits Pty Ltd]:IT Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:HITESH Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:admin An optional company name []:IT
Затем подпишите сертификат с помощью следующей команды:
openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt
Вы должны увидеть следующий вывод:
Signature ok subject=C = IN, ST = Gujarat, L = Junagadh, O = IT, OU = IT, CN = HITESH, emailAddress = Getting Private key Enter pass phrase for nginx.key:
Затем откройте файл виртуального хоста Nginx по умолчанию и определите сертификат:
nano /etc/nginx/sites-enabled/default
Внесите следующие изменения:
server { listen 192.168.0.100:443 ssl; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Сохраните и закройте файл, когда закончите. Затем перезапустите сервер Nginx, чтобы применить эти изменения:
systemctl restart nginx
Защита каталога паролем
При настройке веб-сервера Nginx вы также можете защитить определенный каталог паролем. Вы можете сделать это с помощью файла .htpasswd.
Для этого создайте файл passwd и добавьте в него пользователя с помощью следующей команды:
mkdir /etc/nginx/.htpasswd
htpasswd -c /etc/nginx/.htpasswd/passwd admin
Вы должны увидеть следующий вывод:
New password: Re-type new password: Adding password for user admin
Затем создайте тестовый каталог внутри веб-корня Nginx с помощью следующей команды:
mkdir /var/www/html/test
Затем передайте право собственности пользователю www-data с помощью следующей команды:
chown -R www-data:www-data /var/www/html/test
Затем откройте файл виртуального хоста Nginx по умолчанию с помощью следующей команды:
nano /etc/nginx/sites-enabled/default
Затем защитите тестовый каталог, как показано ниже:
location /test { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd/passwd;
Сохраните и закройте файл, когда закончите. Затем перезапустите службу Nginx, чтобы применить эти изменения:
systemctl restart nginx
Затем откройте веб-браузер и введите URL-адрес http://your-server-ip/test. Вам будет предложено ввести имя пользователя и пароль для доступа к тестовому каталогу, как показано на следующей странице:
Поздравляем! вы успешно защитили свой сервер Nginx на сервере Ubuntu 18.04. Надеюсь, это поможет вам защитить ваше приложение, размещенное на веб-сервере Nginx. Не стесняйтесь спрашивать меня, если у вас есть какие-либо вопросы. Для получения дополнительной информации вы можете обратиться к документу по безопасности Nginx.