Вступление
DigitalOceanCloud Firewalls обеспечивает мощный межсетевой экран на уровне сети, защищая ваши ресурсы от неавторизованного трафика.
Хотя вы можете настроить облачные брандмауэры с помощью панели управления DigitalOcean, когда вам нужно управлять несколькими каплями, вам нужно создавать сценарии процесса или предпочитать работать с терминала, лучше использовать интерфейс командной строки.
В этом руководстве мы узнаем, как использоватьdoctl
- официальныйDigitalOcean Command-Line Client - для создания облачных брандмауэров для веб-сервера и управления ими.
Предпосылки
Для этого урока вам понадобятся:
-
doctl
версии 1.7.0 установлен и аутентифицирован с помощьюofficial installation instructions in thedoctl
GitHub repository. (Используйте командуdoctl version
, чтобы проверить, какую версиюdoctl
вы используете.) -
Ключ SSH добавлен в вашу учетную запись DigitalOcean, следуя руководствуHow To Use SSH Keys with DigitalOcean Droplets.
Мы создадим образ стека 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.