W ostatnim roku pojawiło się wiele wycieków z baz danych (, i ). W wielu przypadkach w bazie przechowywane były dane osobowe. Można było uniknąć tych wycieków, gdyby po wdrożeniu bazy administratorzy zadbali o kilka prostych ustawień. Dzisiaj o nich porozmawiamy.
Od razu zaznaczymy, że w naszej praktyce używamy Elasticsearch do przechowywania logów i analizy dzienników środków ochrony informacji, systemu operacyjnego i oprogramowania w naszej platformie IaaS, spełniającej wymagania ustawy 152-FZ, Cloud-152.

Sprawdzamy, czy baza nie jest dostępna w internecie
W większości znanych przypadków wycieków (, ) haker uzyskał dostęp do danych dość prosto: baza była opublikowana w internecie i można się do niej podłączyć bez uwierzytelnienia.
Najpierw przyjrzyjmy się publikacji w internecie. Dlaczego tak się dzieje? Chodzi o to, że dla bardziej elastycznej pracy Elasticsearch tworzy się klaster z trzech serwerów. Aby bazy danych mogły się komunikować, trzeba otworzyć porty. W efekcie administratorzy w żaden sposób nie ograniczają dostępu do bazy, więc można się do niej podłączyć zdalnie. Sprawdzić, czy baza jest dostępna z zewnątrz, jest łatwo. Wystarczy w przeglądarce wpisać http://[IP/Nazwa Elasticsearch]:9200/_cat/nodes?v
Jeśli można się zalogować, trzeba natychmiast to zamknąć.
Zabezpieczamy połączenie z bazą danych
Teraz zrobimy tak, aby nie można było połączyć się z bazą bez uwierzytelnienia.
Elasticsearch ma moduł uwierzytelniania, który ogranicza dostęp do bazy, ale jest on dostępny tylko w płatnym zestawie wtyczek X-Pack (1 miesiąc bezpłatnego korzystania).
Dobrą wiadomością jest to, że jesienią 2019 roku Amazon ujawnił swoje rozwiązania, które pokrywają się z X-Pack. Funkcja uwierzytelniania przy połączeniu z bazą stała się dostępna na wolnej licencji dla wersji Elasticsearch 7.3.2, a nowa wersja dla Elasticsearch 7.4.0 jest już w trakcie prac.
Instalacja tej wtyczki jest prosta. Wchodzimy do konsoli serwera i podłączamy repozytorium:
Na bazie RPM:
curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo
yum update
yum install opendistro-security
Na bazie DEB:
wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -Konfigurujemy interakcję między serwerami za pomocą SSL
Podczas instalacji wtyczki zmienia się konfiguracja portu połączenia z bazą danych. Włącza się szyfrowanie SSL. Aby serwery klastra mogły dalej ze sobą współpracować, należy skonfigurować interakcję między nimi za pomocą SSL.
Zaufanie między hostami można ustanowić za pomocą własnego centrum certyfikacji lub bez niego. W przypadku pierwszej metody wszystko jest jasne: wystarczy skontaktować się z ekspertami od CA. Przejdźmy od razu do drugiej.
- Tworzymy zmienną z pełną nazwą domeny:
export DOMAIN_CN="example.com" - Tworzymy klucz prywatny:
openssl genrsa -out root-ca-key.pem 4096 - Podpisujemy certyfikat root. Przechowuj go jak oczko w głowie: w przypadku jego utraty lub kompromitacji, zaufanie między wszystkimi hostami będzie wymagało ponownej konfiguracji.
openssl req -new -x509 -sha256 -subj "\/C=RU\/ST=Moscow\/O=Moscow, Inc.\/CN=${DOMAIN_CN}" -key root-ca-key.pem -out root-ca.pem - Tworzymy klucz administratora:
openssl genrsa -out admin-key-temp.pem 4096 openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem - Tworzymy żądanie podpisu certyfikatu:
openssl req -new -subj "\/C=RU\/ST=Moscow\/O=Moscow Inc.\/CN=${DOMAIN_CN}\/CN=admin " -key admin-key.pem -out admin.csr - Tworzymy certyfikat administratora:
openssl x509 -req -extensions usr_cert -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem - Tworzymy certyfikaty dla węzła Elasticsearch:
export NODENAME="node-01" openssl genrsa -out ${NODENAME}-key-temp.pem 4096 openssl pkcs8 -inform PEM -outform PEM -in ${NODENAME}-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out ${NODENAME}-key.pem - Tworzymy żądanie podpisu:
openssl req -new -subj "\/C=RU\/ST=Moscow\/O=Moscow Inc.\/CN=${NODENAME}.${DOMAIN_CN}" -addext"subjectAltName=DNS:${NODENAME}.${DOMAIN_CN},DNS:www.${NODENAME}.${DOMAIN_CN}" -key ${NODENAME}-key.pem -out ${NODENAME}.csr - Podpisujemy certyfikat:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem - Rozkładamy certyfikat między węzłami Elasticsearch w folderze:
/etc/elasticsearch/
będziemy potrzebować plików:node-01-key.pem node-01.pem admin-key.pem admin.pem root-ca.pem - Konfigurujemy /etc/elasticsearch/elasticsearch.yml – zmieniamy nazwy plików z certyfikatami na te, które wygenerowaliśmy:
opendistro_security.ssl.transport.pemcert_filepath: node-01.pem opendistro_security.ssl.transport.pemkey_filepath: node-01-key.pem opendistro_security.ssl.transport.pemtrustedcas_filepath: root-ca.pem opendistro_security.ssl.transport.enforce_hostname_verification: false opendistro_security.ssl.http.enabled: true opendistro_security.ssl.http.pemcert_filepath: node-01.pem opendistro_security.ssl.http.pemkey_filepath: node-01-key.pem opendistro_security.ssl.http.pemtrustedcas_filepath: root-ca.pem opendistro_security.allow_unsafe_democertificates: false opendistro_security.allow_default_init_securityindex: true opendistro_security.authcz.admin_dn: − CN=admin,CN=example.com,O=Moscow Inc.,ST=Moscow,C=RU opendistro_security.nodes_dn: − CN=node-01.example.com,O=Moscow Inc.,ST=Moscow,C=RU
Zmiana haseł wewnętrznych użytkowników
- Użyj poniższego polecenia, aby wyświetlić hasz hasła w konsoli:
sh ${OD_SEC}/tools/hash.sh -p [hasło] - Zmieniamy hasz w pliku na otrzymany:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Konfigurujemy zaporę ogniową w systemie operacyjnym
- Pozwalamy na uruchomienie zapory ogniowej:
systemctl enable firewalld - Uruchamiamy ją:
systemctl start firewalld - Pozwalamy na połączenie z Elasticsearch:
firewall-cmd --set-default-zone work firewall-cmd --zone=work --add-port=9200/TCP --permanent - Przeładuj zasady zapory ogniowej:
firewall-cmd --reload - Wyświetlamy działające zasady:
firewall-cmd --list-all
Wprowadzamy wszystkie nasze zmiany do Elasticsearch
- Tworzymy zmienną z pełną ścieżką do folderu z wtyczką:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/" - Uruchamiamy skrypt, który zaktualizuje hasła i sprawdzi ustawienia:
${OD_SEC}/tools/securityadmin.sh -cd ${OD_SEC}/securityconfig/ -icl -nhnv -cacert /etc/elasticsearch/root-ca.pem -cert /etc/elasticsearch/admin.pem -key /etc/elasticsearch/admin-key.pem - Sprawdzamy, czy zmiany zostały zastosowane:
curl -XGET https://[IP/Nazwa Elasticsearch]:9200/_cat/nodes?v -u admin:[hasło] --insecure
To wszystko, to minimalne ustawienia, które zabezpieczają Elasticsearch przed nieautoryzowanym połączeniem.
Źródło: habr.com
