Како да поставите заштитен ѕид на Iptables за да го заштитите сообраќајот помеѓу вашите сервери
Вовед
Распоредувањето на дискретни компоненти во поставувањето на вашата апликација на различни јазли е вообичаен начин да се намали оптоварувањето и да се започне хоризонтално скалирање. Типичен пример е конфигурирање на база на податоци на посебен сервер од вашата апликација. Иако има голем број на предности со ова поставување, поврзувањето преку мрежа вклучува нов сет на безбедносни проблеми.
Во ова упатство, ќе покажеме како да поставите заштитен ѕид на секој од вашите сервери во дистрибуирано поставување. Ќе ја конфигурираме нашата политика за да го дозволиме планираниот сообраќај помеѓу нашите компоненти, додека го отфрламе другиот сообраќај.
Можете исто така да ги конфигурирате огнените ѕидови на облакот на DigitalOcean кои работат како дополнителен, надворешен слој на вашите сервери на инфраструктурата на DigitalOcean. На овој начин, не мора да конфигурирате заштитен ѕид на самите сервери.
За демонстрација во овој водич, ќе користиме два Ubuntu 22.04 сервери. Едниот ќе има веб-апликација опслужена со Nginx, а другата ќе биде домаќин на базата на податоци MySQL за апликацијата. Иако ќе го користиме ова поставување како пример, треба да можете да ги екстраполирате вклучените техники за да одговараат на вашите сопствени барања на серверот.
Предуслови
За да започнете, ќе мора да имате два свежи Ubuntu 22.04 сервери. Додајте обична корисничка сметка со привилегии sudo
на секоја од нив. За да го направите ова, следете го нашиот првичен водич за поставување сервер на Ubuntu 22.04.
Поставувањето на апликацијата што ќе го обезбедиме се заснова на овој водич. Ако сакате да го следите тој пример, поставете ги серверите за апликации и бази на податоци како што е наведено во тој туторијал. Во спротивно, можете да го користите овој напис како општа референца.
Чекор 1 - Поставување заштитен ѕид
Ќе започнете со имплементирање на основна конфигурација на заштитен ѕид за секој од вашите сервери. Политиката што ќе ја спроведуваме има пристап на прво место безбедност. Ќе заклучиме речиси сè друго освен SSH сообраќајот, а потоа ќе правиме дупки во заштитниот ѕид за нашата специфична апликација.
Овој водич ја следи синтаксата iptables
. iptables
автоматски се инсталира на Ubuntu 22.04 со помош на заднината nftables
, така што не треба да инсталирате дополнителни пакети.
Користејќи го nano
или вашиот омилен текстуален уредувач, отворете ја датотеката /etc/iptables/rules.v4
:
- sudo nano /etc/iptables/rules.v4
Залепете ја конфигурацијата од водичот за шаблон за заштитен ѕид:
*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# Custom per-protocol chains
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]
# Acceptable UDP traffic
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
# Acceptable ICMP traffic
# Boilerplate acceptance policy
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Drop invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
# Reject anything that's fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
# Commit the changes
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
Зачувајте ја и затворете ја датотеката. Ако користите nano
, притиснете Ctrl+X
за да излезете, потоа кога ќе биде побарано, Y
и потоа Enter.
Ако го имплементирате ова во живо опкружување, сè уште не ги вчитувајте правилата за заштитниот ѕид повторно. Вчитувањето на правилото наведено овде веднаш ќе ја прекине врската помеѓу вашата апликација и серверот на базата на податоци. Ќе треба да ги приспособите правилата за да ги одразуваат нашите оперативни потреби пред повторно да ги вчитате.
Чекор 2 - Откријте ги пристаништата што ги користат вашите услуги
За да дозволите комуникација помеѓу вашите компоненти, треба да ги знаете мрежните порти што се користат. Може да ги пронајдете точните мрежни порти со испитување на вашите конфигурациски датотеки, но апликативно-агностичкиот метод за наоѓање на точните порти е само да проверите кои услуги слушаат конекции на секоја од нашите машини.
Можете да ја користите алатката netstat
за да го дознаете ова. Бидејќи вашата апликација комуницира само преку IPv4, ќе го додадеме аргументот -4
, но можете да го отстраните ако користите и IPv6. Другите аргументи што ви се потребни за да ги пронајдете вашите услуги кои работат се -p
, -l
, -u
, -n
, и -t
, кои можете да ги дадете како -plunt
.
Овие аргументи може да се разложат на следниов начин:
p
: Покажете го PID и името на програмата на која припаѓа секој сокет.l
: прикажувајте само приклучоци за слушање.u
: Прикажи UDP сообраќај.n
: Прикажи нумерички излез наместо имиња на услуги.t
: Прикажи TCP сообраќај.
- sudo netstat -4plunt
На вашиот веб-сервер, вашиот излез може да изгледа вака:
OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1058/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4187/nginx
Првата означена колона ги прикажува IP адресата и портот што ги слуша услугата означена кон крајот на линијата. Специјалната адреса 0.0.0.0
значи дека предметната услуга ги слуша сите достапни адреси.
На вашиот сервер за база на податоци, вашиот излез може да изгледа вака:
- sudo netstat -4plunt
OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1097/sshd
tcp 0 0 192.0.2.30:3306 0.0.0.0:* LISTEN 3112/mysqld
Можете да ги прочитате овие колумни потполно исто. Во овој пример, адресата 192.0.2.30
ја претставува приватната IP адреса на серверот на базата на податоци. Во упатството за предуслов, го ограничивте MySQL на приватниот интерфејс од безбедносни причини.
Забележете ги вредностите што ги наоѓате во овој чекор. Ова се мрежните детали што ќе ви требаат за да ја прилагодите конфигурацијата на вашиот заштитен ѕид.
На вашиот веб-сервер, треба да се осигурате дека следните порти се достапни:
- Порт 80 на сите адреси
- Порта 22 на сите адреси (веќе е пресметана во правилата за заштитен ѕид)
Вашиот сервер за база на податоци треба да обезбеди пристап до следните порти:
- Порта 3306 на адресата
192.0.2.30
(или интерфејсот поврзан со неа) - Порта 22 на сите адреси (веќе е пресметана во правилата за заштитен ѕид)
Чекор 3 - Прилагодете ги правилата за заштитен ѕид на веб-серверот
Сега кога ги имате потребните информации за портата, ќе го прилагодите множеството правила за заштитен ѕид на вашиот веб-сервер. Отворете ја датотеката со правила во вашиот уредник со привилегии sudo
:
- sudo nano /etc/iptables/rules.v4
На веб-серверот, треба да ја додадете портата 80 на вашата листа на прифатлив сообраќај. Бидејќи серверот слуша на сите достапни адреси - веб-серверите генерално очекуваат да бидат достапни од секаде - нема да го ограничувате правилото по интерфејс или адреса на дестинација.
Вашите веб посетители ќе го користат протоколот TCP за да се поврзат. Вашата рамка веќе има сопствен синџир наречен TCP
за исклучоци од TCP апликации. Можете да додадете порта 80 на тој синџир, веднаш под исклучокот за вашата SSH порта:
*filter
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 80 -j ACCEPT
. . .
Вашиот веб-сервер ќе ја иницира врската со вашиот сервер за база на податоци. Вашиот појдовен сообраќај не е ограничен во вашиот заштитен ѕид и дојдовниот сообраќај поврзан со воспоставените врски е дозволен, така што не мораме да отвораме дополнителни порти на овој сервер за да ја дозволиме оваа врска.
Зачувајте ја и затворете ја датотеката кога ќе завршите. Вашиот веб-сервер сега има политика за заштитен ѕид што ќе го дозволи целиот легитимен сообраќај додека блокира сè друго.
Тестирајте ја датотеката со правила за синтаксни грешки:
- sudo iptables-restore -t < /etc/iptables/rules.v4
Ако не се прикажуваат синтаксички грешки, повторно вчитајте го заштитниот ѕид за да го имплементирате новиот сет на правила:
- sudo service iptables-persistent reload
Чекор 4 - Прилагодете ги правилата за заштитен ѕид на серверот за база на податоци
На серверот на вашата база на податоци, треба да дозволите пристап до портата 3306
на приватната IP адреса на вашиот сервер. Во овој случај, таа адреса беше 192.0.2.30
. Можете да го ограничите пристапот наменет конкретно за оваа адреса или може да го ограничите пристапот со совпаѓање со интерфејсот на кој му е доделена таа адреса.
За да го пронајдете мрежниот интерфејс поврзан со таа адреса, извршете ip -4 addr show scope global
:
- ip -4 addr show scope global
Output2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 203.0.113.5/24 brd 104.236.113.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.0.2.30/24 brd 192.0.2.255 scope global eth1
valid_lft forever preferred_lft forever
Означените области покажуваат дека интерфејсот eth1
е поврзан со таа адреса.
Следно, ќе ги прилагодите правилата за заштитен ѕид на серверот за базата на податоци. Отворете ја датотеката со правила со привилегии sudo
на вашиот сервер за база на податоци:
- sudo nano /etc/iptables/rules.v4
Повторно, ќе додавате правило во нашиот синџир TCP
за да формирате исклучок за врската помеѓу вашите веб-сервери и базата на податоци.
За да го ограничите пристапот врз основа на вистинската адреса за која станува збор, би го додале правилото вака:
*filter
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 3306 -d 192.0.2.30 -j ACCEPT
. . .
Ако повеќе сакате да го дозволите исклучокот врз основа на интерфејсот во кој се наоѓа таа адреса, наместо тоа, можете да додадете правило слично на ова:
*filter
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 3306 -i eth1 -j ACCEPT
. . .
Зачувајте ја и затворете ја датотеката кога ќе завршите.
Проверете дали има синтаксички грешки со оваа команда:
- sudo iptables-restore -t < /etc/iptables/rules.v4
Кога ќе бидете подготвени, повторно вчитајте ги правилата за заштитен ѕид:
- sudo service iptables-persistent reload
И двата ваши сервери сега треба да бидат заштитени без ограничување на потребниот проток на податоци меѓу нив.
Заклучок
Спроведувањето на соодветен заштитен ѕид секогаш треба да биде дел од вашиот план за распоредување кога поставувате апликација. Иако ја демонстриравме оваа конфигурација користејќи два сервери кои работат со Nginx и MySQL, техниките прикажани погоре се применливи без оглед на вашите специфични избори за технологија.
За да дознаете повеќе за конкретно заштитните ѕидови и iptables
, погледнете ги следните водичи:
- Како да изберете ефективна политика за заштитен ѕид за да ги обезбедите вашите сервери
- Длабоко нурне во архитектурата на Iptables и Netfilter
- Како да ја тестирате конфигурацијата на вашиот заштитен ѕид со Nmap и Tcpdump