Как защитить инфраструктуру веб-сервера с помощью облачных брандмауэров DigitalOcean с помощью Doctl

Вступление

DigitalOceanCloud Firewalls обеспечивает мощный межсетевой экран на уровне сети, защищая ваши ресурсы от неавторизованного трафика.

Хотя вы можете настроить облачные брандмауэры с помощью панели управления DigitalOcean, когда вам нужно управлять несколькими каплями, вам нужно создавать сценарии процесса или предпочитать работать с терминала, лучше использовать интерфейс командной строки.

В этом руководстве мы узнаем, как использоватьdoctl - официальныйDigitalOcean Command-Line Client - для создания облачных брандмауэров для веб-сервера и управления ими.

Предпосылки

Для этого урока вам понадобятся:

Мы создадим образ стека LAMP (Linux, Apache, MySQL, PHP) одним щелчком мыши под управлением Ubuntu 16.04 в областиnyc1 и поместим его в каплю размером 512 МБ. Однако перед тем, как начать это руководство, мы рекомендуем вам ознакомиться сdoctl и облачными брандмауэрами, прочитавHow To Use Doctl, the Official DigitalOcean Command-Line Client иAn Introduction To DigitalOcean Cloud Firewalls.

[[step-1 -—- setting-up-the-web-server]] == Шаг 1 - Настройка веб-сервера

Сначала мы выберем регион для нашей капли. В этом руководстве мы будем использоватьnyc1, но вы можете увидеть все регионы и их слага с помощью следующей команды:

doctl compute region list
OutputSlug    Name               Available
nyc1    New York 1         true
sfo1    San Francisco 1    true
ams2    Amsterdam 2        true
sgp1    Singapore 1        true
lon1    London 1           true
nyc3    New York 3         true
ams3    Amsterdam 3        true
fra1    Frankfurt 1        true
tor1    Toronto 1          true
sfo2    San Francisco 2    true
blr1    Bangalore 1        true

Поскольку мы не хотим пересылать пароли по сети и хотим уменьшить вероятность появленияbrute-force attack, мы защитим наш веб-сервер с помощью аутентификации по ключу SSH.

Чтобы создать каплю, содержащую ключ SSH,doctl требуется отпечаток ключа SSH, который можно получить с помощью команды:

doctl compute ssh-key list
OutputID         Name                  FingerPrint
9763174    sammy_rsa             your_ssh_key_fingerprint

Скопируйте отпечаток ключа SSH, который вы хотите использовать со своей каплей.

Теперь давайте объединим все в одной команде, которая создаст каплю размером 512 МБ с именемweb-1 в областиnyc1, используя образ стека LAMP одним щелчком мыши под управлением Ubuntu 16.04 с нашим ключом SSH.

doctl compute droplet create web-1 \
    --region nyc1 \
    --image lamp-16-04 \
    --ssh-keys your_ssh_key_fingerprint \
    --size 512mb

Вывод дает нам обзор только что созданной капли, в том числе идентификатор капли, имя, адрес IPv4, память и многое другое:

OutputID          Name          Public IPv4       Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
52059458    web-1                                                          512       1        20      nyc1      Ubuntu LAMP on 16.04    new

[.note] #Note: Вам нужно подождать несколько минут для завершения процесса подготовки. После инициализации дроплет будет иметь адрес IPv4 и статусactive вместоnew.
#

Используйте следующую команду, чтобы проверить состояние вашей капли и, если она полностью настроена, запишите идентификатор, который нам понадобится при назначении брандмауэра капле на шаге 2. Не переходите дальше этого шага, пока статус вашей капли не станетactive.

doctl compute droplet list web-1
OutputID          Name          Public IPv4       Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
52059458     web-1         203.0.113.1                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    active

Затем используйтеdoctl для входа в Droplet через SSH, включив установку LAMP и получив дополнительные инструкции о том, как подготовить сервер к производственному использованию. Если вы получили сообщение об ошибкеconnection refused, ваша капля еще не готова. Подождите несколько минут, а затем повторно запустите командуlist, чтобы убедиться, что статус вашей капли установлен наactive, прежде чем продолжить.

doctl compute ssh web-1
Output...
-------------------------------------------------------------------------------
Thank you for using DigitalOcean's LAMP Application.

LAMP has now been enabled. You can access your LAMP instance at:
Your web root is located at /var/www/html and can be seen from
    http://203.0.113.1
...

После того, как вы настроите Droplet для своих нужд, выйдите из сеанса SSH.

[environment]
exit

Наконец, укажите в своем веб-браузере IP-адрес Droplet, чтобы убедиться, что стек LAMP работает правильно. По умолчанию вы должны увидеть целевую страницу стека LAMP DigitalOcean одним щелчком мыши с сообщением: «Пожалуйста, войдите в свой дроплет через SSH, чтобы настроить установку LAMP». Если вы этого не сделаете, повторно проследите предыдущие шаги, чтобы убедиться, что вы включил LAMP и что вы правильно скопировали IP-адрес вашего Droplet в ваш браузер.

Поскольку мы уже завершили настройку LAMP, необходимую для этого учебного пособия, мы готовы перейти к защите капли от несанкционированного трафика.

[[шаг-2 -—- создание-брандмауэра-для-веб-сервера]] == Шаг 2 - Создание брандмауэра для веб-сервера

Для начала мы воспользуемся идентификатором капли, который мы получили от командыdoctl compute droplet list на шаге 1, чтобы создать облачный брандмауэр с именемweb-firewall, который разрешает входящие SSH-соединения на порт22 и все исходящие Соединения TCP, UDP и ICMP. Это позволит нам администрировать сервер из командной строки, в то же время предоставляя многим базовым службам возможность нормально работать.

Полеprotocol является обязательным и должно быть установлено наtcp,udp илиicmp, и вы должны включить значениеports для всех протоколов, кромеicmp, который, согласноspecification, не требует его.

Полеaddress указывает, каким IP-адресам разрешен доступ к данному порту. Если вы хотите разрешить трафик со всех адресов IPv4, используйте0:0:0:0/0, а если вы хотите разрешить трафик со всех адресов IPv6, используйте::0/0.

Наконец, каждый созданный вами межсетевой экран должен иметь хотя бы одно правило либо под флагом--inbound-rules, либо под флагом--outbound-rules, и все значения должны быть введены в виде списковkey:value, разделенных запятыми. Используйте строку в кавычках, разделенную пробелами, для нескольких правил.

Теперь используйте командуcreate для создания межсетевого экрана:

doctl compute firewall create --name web-firewall \
 --droplet-ids your_droplet_id \
 --inbound-rules "protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0" \
 --outbound-rules "protocol:icmp,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:all,address:0.0.0.0/0,address:::/0 protocol:udp,ports:all,address:0.0.0.0/0,address:::/0"

Вывод содержит базовый обзор нового облачного брандмауэра. Запишите идентификатор облачного брандмауэра, так как вы будете использовать его на шаге 3 для добавления дополнительных правил в брандмауэр.

OutputID                                      Name            Status     Created At              Inbound Rules                                           Outbound Rules                                                                                                                                                  Droplet IDs    Tags    Pending Changes
c7b39b43-4fcc-4594-88f2-160a64aaddd4    web-firewall    waiting    2017-06-17T21:20:38Z    protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0    protocol:icmp,ports:0,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:0,address:0.0.0.0/0,address:::/0 protocol:udp,ports:0,address:0.0.0.0/0,address:::/0    your_droplet_id               droplet_id:your_droplet_id,removing:false,status:waiting

Если вам когда-либо понадобится указать диапазон портов, используйте следующий формат:

--inbound-rules "protocol:tcp,ports:8000-8080,address:0.0.0.0/0,address:::/0"

Вы также можете использовать флагdroplet_id вместо флагаaddress. Это может быть особенно полезно в установках, которые включают в себя несколько капель, взаимодействующих друг с другом.

--inbound-rules "protocol:tcp,ports:8000-8080,droplet_id:your_droplet_id"

И вы можете объединить несколько полейaddress илиdroplet_id в одно правило, например:

--inbound-rules "protocol:tcp,ports:8000-8080,droplet_id:your_first_droplet_id,droplet_id:your_second_droplet_id"

На этом этапе убедитесь, что облачный брандмауэр работает правильно, указав в веб-браузере IP-адрес Droplet. Вы должны увидеть сообщение о том, что сайт больше недоступен. Если вы этого не сделали, еще раз проверьте вывод предыдущей командыcreate, чтобы убедиться, что вы не пропустили никаких сообщений об ошибках.

Наконец, хотя наше правило для входящего трафика уже должно разрешать SSH, мы проверим его с помощьюdoctl.

doctl compute ssh web-1

Если вам не удается подключиться к Droplet, серия руководствHow To Troubleshoot SSH поможет вам диагностировать проблему.

После успешного подключения к дроплету выйдите из сеанса SSH:

[environment]
exit

Теперь, когда мы убедились, что облачный брандмауэр работает правильно, мы добавим дополнительное правило, разрешающее входящий трафик на веб-сервер.

[[шаг-3 -—- добавление-дополнительных-правил]] == Шаг 3 - Добавление дополнительных правил

Используя идентификатор брандмауэра, который мы получили от командыdoctl compute firewall create на шаге 2, мы собираемся добавить правило, разрешающее входящий TCP-трафик для Apache через порт80.

Мы будем использовать командуadd-rules, для которой требуется идентификатор брандмауэра и хотя бы одно правило. Правила указываются с помощью флагов--outbound-rules и--inbound-rules, как и на шаге 2.

doctl compute firewall add-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
    --inbound-rules "protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0"

Если вам нужен HTTPS, разрешите входящий TCP-трафик на порт443.

doctl compute firewall add-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
    --inbound-rules "protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0"

В случае успеха эта команда не будет выводить. Если вы получили сообщение об ошибке, следуйте инструкциям на экране для диагностики проблемы.

Теперь переместите ваш веб-браузер на IP-адрес вашего Droplet. На этот раз вы должны снова увидеть целевую страницу стека LAMP в DigitalOcean по умолчанию. Если вы этого не сделаете, дважды проверьте, правильно ли вы скопировали свой IP-адрес в веб-браузер, а затем повторно проследите предыдущие шаги.

Если у вас есть дополнительные веб-серверы, которые вы хотите защитить, перейдите к шагу 4. В противном случае перейдите к шагу 5, где мы будем управлять облачными брандмауэрами с помощью тегов.

[[optional-step-4 -—- add-droplets-to-the-firewall]] == (Необязательно) Шаг 4 - Добавление капель в брандмауэр

Если у вас есть несколько капель, вы можете применить один и тот же облачный брандмауэр к каждому из них.

Используйте командуadd-droplets, чтобы добавить дополнительные капли в облачный брандмауэр. Для этой команды требуется идентификатор облачного брандмауэра в качестве аргумента, и она использует флагdroplet-ids, чтобы определить, к каким каплям применить брандмауэр.

Если вы не знаете идентификатор облачного брандмауэра, используйте командуlist:

doctl compute firewall list
OutputID                                      Name                      Status       Created At              Inbound Rules                                                                                                Outbound Rules                                                                                                                                                  Droplet IDs    Tags              Pending Changes
c7b39b43-4fcc-4594-88f2-160a64aaddd4    web-firewall              succeeded    2017-06-17T21:20:38Z    protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0    protocol:icmp,ports:0,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:0,address:0.0.0.0/0,address:::/0 protocol:udp,ports:0,address:0.0.0.0/0,address:::/0    52059458

Вы также можете использовать командуlist для получения идентификаторов капель:

doctl compute droplet list
OutputID          Name                Public IPv4       Private IPv4     Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
51146959    test-1              203.0.113.1                                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
52059458    web-1               203.0.113.2                                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

Используя следующую командуdoctl, мы добавим каплюtest-1 к брандмауэруweb-servers с идентификаторомc7b39b43-4fcc-4594-88f2-160a64aaddd4:

doctl compute firewall add-droplets c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
    --droplet-ids 51146959

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

И, если вы хотите добавить несколько капель одновременно, разделите их запятыми. Обратите внимание, что между двумя идентификаторами нет пробелов:

--droplet-ids 51146959,52059458

Теперь давайте использовать теги для упрощения управления облачным брандмауэром.

[[step-5 -—- using-tags]] == Шаг 5. Использование тегов

На данный момент мы добавили отдельные капли в облачный брандмауэр, но облачные брандмауэры также поддерживают теги для более удобного управления несколькими ресурсами. Чтобы лучше понять, как работают теги, см.How To Tag DigitalOcean Droplets.

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

Прежде чем мы сможем добавить тег к капле с помощьюdoctl, нам нужно сначала создать тег с помощью командыtag create:

doctl compute tag create web-servers
OutputName           Droplet Count
web-servers    0

После создания тега примените его к капле с помощью командыdroplet tag. Эта команда принимает в качестве аргумента идентификатор капли и получает имя тега из флага--tag-name.

doctl compute droplet tag 52059458 \
    --tag-name "web-servers"

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

Затем добавьте тег в облачный брандмауэр с помощью командыadd-tags, которая принимает идентификатор брандмауэра в качестве аргумента и получает список имен тегов для использования из флага--tag-names:

doctl compute firewall add-tags c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
    --tag-names web-servers

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

И, если вам нужно добавить несколько тегов, предоставьте их в виде списка через запятую:

--tag-names web-servers,backend-servers

Наконец, мы можем удалить идентификатор капли из брандмауэра, поскольку капля является частью тегаweb-servers, и теперь этот тег полностью защищен.

doctl compute firewall remove-droplets c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
    --droplet-ids 52059458

Повторите предыдущий шаг для каждой капли, которую вы хотите защитить только тегом.

[.предупреждение]##

Warning: Удаление неотмеченных капель из облачного брандмауэра оставляет капли незащищенными от неавторизованного трафика.

Теперь у вас есть полностью настроенный облачный брандмауэр, который защитит ваш веб-сервер от несанкционированного трафика. Если вы также хотите удалить правило из брандмауэра, перейдите к шагу 6.

[[optional-step-6 -—- remove-rules-from-the-firewall]] == (Необязательно) Шаг 6. Удаление правил из брандмауэра

Если вы хотите удалить правило из облачного брандмауэра, используйте командуremove-rules.

Командаremove-rules принимает в качестве аргумента идентификатор межсетевого экрана, а правила задаются с помощью флагов--outbound-rules и--inbound-rules. Обратите внимание, что указанное правило должно быть точно таким же, как правило, которое использовалось при создании.

doctl compute firewall remove-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
    --inbound-rules protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0

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

Заключение

В этом руководстве мы использовалиdoctl для создания облачных межсетевых экранов DigitalOcean, добавления правил к этим межсетевым экранам, добавления дополнительных капель к межсетевым экранам, управления межсетевыми экранами с помощью тегов и удаления правил из межсетевых экранов.

Чтобы узнать о других способах использования облачных брандмауэров, см.How To Organize DigitalOcean Cloud Firewalls.

А чтобы узнать об устранении неполадок облачных брандмауэров, посетитеHow To Troubleshoot DigitalOcean Firewalls.

Related