Hur man konfigurerar Elasticsearch för att undvika läckor

Det senaste året har det varit många läckor från databaser Elasticsearch (här, här и här). I många fall lagrades personuppgifter i databasen. Dessa läckor kunde ha undvikits om administratörerna efter att ha distribuerat databasen hade brytt sig om att kontrollera några enkla inställningar. Idag ska vi prata om dem.

Låt oss omedelbart reservera att vi i vår praktik använder Elasticsearch för att lagra loggar och analysera loggar för informationssäkerhetsverktyg, OS och mjukvara i vår IaaS-plattform, som uppfyller kraven i 152-FZ, Cloud-152. 

Hur man konfigurerar Elasticsearch för att undvika läckor

Vi kontrollerar om databasen "sticker ut" till Internet

I de flesta kända fall av läckor (här, här) angriparen fick tillgång till data enkelt och opretentiöst: databasen publicerades på Internet och det var möjligt att ansluta till den utan autentisering.  

Låt oss först ta itu med publicering på Internet. Varför händer detta? Faktum är att för mer flexibel drift av Elasticsearch rekommenderad skapa ett kluster med tre servrar. För att databaserna ska kunna kommunicera med varandra måste du öppna portar. Som ett resultat begränsar administratörer inte åtkomsten till databasen på något sätt, och du kan ansluta till databasen var som helst. Det är enkelt att kontrollera om databasen är tillgänglig utifrån. Ange bara i webbläsaren http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Om du kan komma in, spring då för att stänga den.

Skyddar anslutningen till databasen

Nu ska vi göra det så att det är omöjligt att ansluta till databasen utan autentisering.

Elasticsearch har en autentiseringsmodul som begränsar åtkomsten till databasen, men den är endast tillgänglig i det betalda X-Pack-pluginsetet (1 månad gratis användning).

Den goda nyheten är att Amazon under hösten 2019 öppnade sin utveckling, som överlappar med X-Pack. Autentiseringsfunktionen vid anslutning till en databas har blivit tillgänglig under en gratis licens för version Elasticsearch 7.3.2, och en ny version för Elasticsearch 7.4.0 är redan på gång.

Detta plugin är lätt att installera. Gå till serverkonsolen och anslut arkivet:

RPM-baserad:

curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo

yum update

yum install opendistro-security


DEB-baserat:

wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -

Ställa in interaktion mellan servrar via SSL

När plugin-programmet installeras ändras konfigurationen av porten som ansluter till databasen. Det möjliggör SSL-kryptering. För att klusterservrarna ska fortsätta att arbeta med varandra måste du konfigurera interaktionen mellan dem med hjälp av SSL.

Förtroende mellan värdar kan etableras med eller utan en egen certifikatutfärdare. Med den första metoden är allt klart: du behöver bara kontakta CA-specialister. Låt oss gå direkt till den andra.

  1. Skapa en variabel med det fullständiga domännamnet:

    export DOMAIN_CN="example.com"

  2. Skapa en privat nyckel:

    openssl genrsa -out root-ca-key.pem 4096

  3. Signera rotcertifikatet. Håll det säkert: om det går förlorat eller äventyras måste förtroendet mellan alla värdar konfigureras om.

    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

  4. Skapa en administratörsnyckel:

    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

  5. Skapa en begäran om att signera certifikatet:

    openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${DOMAIN_CN}/CN=admin " 
    -key admin-key.pem -out admin.csr

  6. Skapa ett administratörscertifikat:

    openssl x509 -req -extensions usr_cert -in admin.csr -CA root-ca.pem 
    -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem

  7. Skapa certifikat för Elasticsearch-noden:

    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

  8. Skapa en signaturförfrågan:

    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

  9. Signering av certifikatet:

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial 
    -sha256 -out node.pem

  10. Placera certifikatet mellan Elasticsearch-noder i följande mapp:

    /etc/elasticsearch/


    vi behöver filerna:

            node-01-key.pem
    	node-01.pem
    	admin-key.pem
    	admin.pem
    	root-ca.pem

  11. Installation /etc/elasticsearch/elasticsearch.yml – ändra namnet på filerna med certifikat till de som genereras av oss:

    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

Ändra lösenord för interna användare

  1. Med hjälp av kommandot nedan matar vi ut lösenordshashen till konsolen:

    sh ${OD_SEC}/tools/hash.sh -p [пароль]

  2. Ändra hash i filen till den mottagna:

    /usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml

Konfigurera en brandvägg i operativsystemet

  1. Tillåt brandväggen att starta:

    systemctl enable firewalld

  2. Låt oss lansera det:

    systemctl start firewalld

  3. Tillåt anslutning till Elasticsearch:

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent

  4. Ladda om brandväggsreglerna:

    firewall-cmd --reload

  5. Här är arbetsreglerna:

    firewall-cmd --list-all

Tillämpar alla våra ändringar på Elasticsearch

  1. Skapa en variabel med den fullständiga sökvägen till mappen med plugin:

    export  OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"

  2. Låt oss köra ett skript som uppdaterar lösenord och kontrollerar inställningar:

    ${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

  3. Kontrollera om ändringarna har tillämpats:

    curl -XGET https://[IP/Имя Elasticsearch]:9200/_cat/nodes?v -u admin:[пароль] --insecure

Det är allt, det här är minimiinställningarna som skyddar Elasticsearch från obehöriga anslutningar.

Källa: will.com

Lägg en kommentar