ในปีที่ผ่านมามีการรั่วไหลของฐานข้อมูลจำนวนมาก
ให้เราจองทันทีว่าในทางปฏิบัติของเรา เราใช้ Elasticsearch เพื่อจัดเก็บบันทึกและวิเคราะห์บันทึกของเครื่องมือรักษาความปลอดภัยข้อมูล ระบบปฏิบัติการ และซอฟต์แวร์ในแพลตฟอร์ม IaaS ของเรา ซึ่งสอดคล้องกับข้อกำหนดของ 152-FZ, Cloud-152
เราตรวจสอบว่าฐานข้อมูล "เกาะติด" กับอินเทอร์เน็ตหรือไม่
ในกรณีส่วนใหญ่ของการรั่วไหล (
ขั้นแรก เรามาจัดการกับการเผยแพร่บนอินเทอร์เน็ตกันก่อน ทำไมสิ่งนี้ถึงเกิดขึ้น? ความจริงก็คือเพื่อการทำงานที่ยืดหยุ่นยิ่งขึ้นของ Elasticsearch
ถ้าเข้าไปได้ก็วิ่งไปปิดเลย
การป้องกันการเชื่อมต่อไปยังฐานข้อมูล
ตอนนี้เราจะทำให้มันเป็นไปไม่ได้ที่จะเชื่อมต่อกับฐานข้อมูลโดยไม่มีการรับรองความถูกต้อง
Elasticsearch มีโมดูลการตรวจสอบสิทธิ์ที่จำกัดการเข้าถึงฐานข้อมูล แต่มีเฉพาะในชุดปลั๊กอิน X-Pack แบบชำระเงินเท่านั้น (ใช้งานฟรี 1 เดือน)
ข่าวดีก็คือในฤดูใบไม้ร่วงปี 2019 Amazon ได้เปิดการพัฒนาซึ่งทับซ้อนกับ X-Pack ฟังก์ชันการตรวจสอบสิทธิ์เมื่อเชื่อมต่อกับฐานข้อมูลพร้อมใช้งานภายใต้สิทธิ์ใช้งานฟรีสำหรับเวอร์ชัน Elasticsearch 7.3.2 และเวอร์ชันใหม่สำหรับ Elasticsearch 7.4.0 อยู่ในผลงานแล้ว
ปลั๊กอินนี้ติดตั้งง่าย ไปที่คอนโซลเซิร์ฟเวอร์และเชื่อมต่อที่เก็บ:
ตามรอบต่อนาที:
curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo
yum update
yum install opendistro-security
ตาม DEB:
wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -
การตั้งค่าการโต้ตอบระหว่างเซิร์ฟเวอร์ผ่าน SSL
เมื่อติดตั้งปลั๊กอิน การกำหนดค่าของพอร์ตที่เชื่อมต่อกับฐานข้อมูลจะเปลี่ยนไป เปิดใช้งานการเข้ารหัส SSL เพื่อให้เซิร์ฟเวอร์คลัสเตอร์สามารถทำงานร่วมกันต่อไปได้ คุณต้องกำหนดค่าการโต้ตอบระหว่างเซิร์ฟเวอร์เหล่านั้นโดยใช้ SSL
ความน่าเชื่อถือระหว่างโฮสต์สามารถสร้างขึ้นโดยมีหรือไม่มีผู้ออกใบรับรองของตนเอง ด้วยวิธีแรก ทุกอย่างชัดเจน: คุณเพียงแค่ต้องติดต่อผู้เชี่ยวชาญ CA ตรงไปที่วินาทีกัน
- สร้างตัวแปรด้วยชื่อโดเมนเต็ม:
export DOMAIN_CN="example.com"
- สร้างคีย์ส่วนตัว:
openssl genrsa -out root-ca-key.pem 4096
- ลงนามใบรับรองหลัก รักษาความปลอดภัย: หากสูญหายหรือถูกบุกรุก ความน่าเชื่อถือระหว่างโฮสต์ทั้งหมดจะต้องได้รับการกำหนดค่าใหม่
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
- สร้างรหัสผู้ดูแลระบบ:
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
- สร้างคำขอเพื่อลงนามใบรับรอง:
openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${DOMAIN_CN}/CN=admin " -key admin-key.pem -out admin.csr
- สร้างใบรับรองผู้ดูแลระบบ:
openssl x509 -req -extensions usr_cert -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem
- สร้างใบรับรองสำหรับโหนด 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
- สร้างคำขอลายเซ็น:
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
- การลงนามใบรับรอง:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem
- วางใบรับรองระหว่างโหนด Elasticsearch ในโฟลเดอร์ต่อไปนี้:
/etc/elasticsearch/
เราต้องการไฟล์:node-01-key.pem node-01.pem admin-key.pem admin.pem root-ca.pem
- ปรับแต่ง /etc/elasticsearch/elasticsearch.yml – เปลี่ยนชื่อไฟล์ที่มีใบรับรองเป็นชื่อที่เราสร้างขึ้น:
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
การเปลี่ยนรหัสผ่านสำหรับผู้ใช้ภายใน
- ด้วยการใช้คำสั่งด้านล่าง เราจะส่งออกแฮชรหัสผ่านไปยังคอนโซล:
sh ${OD_SEC}/tools/hash.sh -p [пароль]
- เปลี่ยนแฮชในไฟล์เป็นแฮชที่ได้รับ:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
การตั้งค่าไฟร์วอลล์ในระบบปฏิบัติการ
- อนุญาตให้ไฟร์วอลล์เริ่มทำงาน:
systemctl enable firewalld
- มาเปิดตัวกัน:
systemctl start firewalld
- อนุญาตการเชื่อมต่อกับ Elasticsearch:
firewall-cmd --set-default-zone work firewall-cmd --zone=work --add-port=9200/TCP --permanent
- โหลดกฎไฟร์วอลล์อีกครั้ง:
firewall-cmd --reload
- นี่คือกฎการทำงาน:
firewall-cmd --list-all
นำการเปลี่ยนแปลงทั้งหมดของเราไปใช้กับ Elasticsearch
- สร้างตัวแปรด้วยเส้นทางแบบเต็มไปยังโฟลเดอร์ด้วยปลั๊กอิน:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"
- มาเรียกใช้สคริปต์ที่จะอัปเดตรหัสผ่านและตรวจสอบการตั้งค่า:
${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
- ตรวจสอบว่ามีการใช้การเปลี่ยนแปลงหรือไม่:
curl -XGET https://[IP/Имя Elasticsearch]:9200/_cat/nodes?v -u admin:[пароль] --insecure
ทั้งหมดนี้คือการตั้งค่าขั้นต่ำที่ปกป้อง Elasticsearch จากการเชื่อมต่อที่ไม่ได้รับอนุญาต
ที่มา: will.com