Elasticsearch 보안 – 인증서
Elasticsearch 가 버전이 높아짐에 따라 인증서에 대한 이해가 필요하게 되었다. 사실 이 인증서가 필요한 이유가 Elastic 에서 배포하는 X-Pack 중에 Security 플러그인 때문인데, 이 Security 를 활성화 하게 되면 TCP, HTTP 통신을 TLS 통신을 하도록 강제하고 있다.
문제는 Elasticsearch 자바 기반이며, 따라서 생성하는 파일이 여느 다른 인증서와는 다른 면도 있다. ‘다른 면도 있다’ 라고 표현한 이유는 일반적인 PEM 형식의 보안키와 인증서를 모두 지원하지만 여전히 자바 세계에서만 통용되는 방법을 여전히 고수하고 있기 때문이다.
keystore 파일
최신 버전의 Elasticsearch 7 을 설치하게 되면 /etc/elasticsearch/elasticsearch.keystore 파일 하나만 생성되게 된다.
이 파일은 key/value 형식으로 계정 정보가 들어가 있다. 이 내용을 적는 이유는 Java Keystore 파일과는 다르다는 것을 말하기 위함이다. Elasticsearch 을 설치하고 나서 Security 를 활성한 후에 계정에 대한 패스워드를 작성하는 절차를 밟는다.
1 2 3 4 5 6 7 8 9 10 |
]# cd /usr/share/elasticsearch/ ]# ./bin/elasticsearch-setup-passwords auto Changed password for user apm_system PASSWORD apm_system = 1QzJrrJ5DPaRJj7BOPRz Changed password for user kibana PASSWORD kibana = 8HlolrAt0Xoh2HMjUGds Changed password for user logstash_system PASSWORD logstash_system = fS6R6b42i7gq0oWX4SaA |
계정에 대한 패스워드를 자동 생성하도록 한 것인데, 이렇게 생성된 내용들은 elasticsearch.keystore 파일에 key/value 형식으로 저장된다.
이렇게 저장된 key 값들은 elasticsearch-keystore 명령어를 통해서 볼 수 있다.
PKCS#12(확장자 p12) 파일
확장자가 p12 파일을 보게 된다. 이 파일은 PKCS#12 형식의 파일인데, 인증서와 개인키를 포함한 형태의 데이터 파일이다. Elasticsearch 7 에서는 루트 인증서(CA 인증서) 와 서버 인증서를 다음과 같이 제작해 사용 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
]# cd /usr/share/elasticsearch ]# ./bin/elasticsearch-certutil ca --days 3650 If you elect to generate PEM format certificates (the -pem option), then the output will be a zip file containing individual files for the CA certificate and private key Please enter the desired output file [elastic-stack-ca.p12]: Enter password for elastic-stack-ca.p12 : ]# cd /usr/share/elasticsearch ]# ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 Enter password for CA (elastic-stack-ca.p12) : Please enter the desired output file [elastic-certificates.p12]: Enter password for elastic-certificates.p12 : Certificates written to /usr/share/elasticsearch/elastic-certificates.p12 |
elastic-stack-ca.p12 은 CA 인증서 인데, openssl 을 이용해서 PKCS12 파일을 읽어볼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
]# openssl pkcs12 -info -nodes -in elastic-stack-ca.p12 Enter Import Password: MAC: sha256, Iteration 10000 MAC length: 32, salt length: 20 PKCS7 Data Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 10000, PRF hmacWithSHA256 Bag Attributes friendlyName: ca localKeyID: 54 69 6D 65 20 31 36 34 38 33 38 38 32 37 34 39 31 30 Key Attributes: <No Attributes> -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDXNp3BI1YX2qxz 6h7svLAkTlSMitpZzgV5Dlk2ZTKzKcTExVVLvL0zvO5JJfFwfWePfNhZyIRXsDR8 SmwrRqr3uysAL9zyqSwvGpRZlPml0a4t8eEYHN9ewV5p2Xzur22ShAetJ2sQ/As9 0lsMEKX3A7LgpOEWMbBrapdcNWt5QAnOOlXnrwCvPmWnd5friQatmggS2/dmfw5V 2EeOQimShRncohtcj9ez80WclATIfkZx1x+m8bpFQVpnt94Rw1a58k4uy6/edL6W 6RJjJYa39PVgjaqNZNGfIAl2STDfQOyHbp6/3BZDmJjt8e0gGHhGKMw1SmuJRvE6 CAsu687tAgMBAAECggEADyX8Aq0/ERzGSL5xAM7jQxr0XpQjfHDA991nsCl9YRkO jZ8qOtOFKdAhoap3DSj2kiYCgIdZsWZou1rttDocLKXTCAdWcQoxXvtq98dBr0dM EFXXN0BJBL1trNuvLInSl56Nf8WnhqGHFQnqeLXvSKzM+X0BjvNebKErGEV2VClp tUvP+5E9SnfJf/QBSrsoCaZkCSc08WNQL1iqubC95593DXImLYCR0MOQHWqVg+hW 6VZJrJhSGUivd5g3TxhGCmEXeYqaT5Vv2xMhLkKVVD4+kLw3C7rfiDrL24KdNeb0 qq8ZL6a/nEnILiS53G4kT2VU0eOo8GqyDdQc/LJzLQKBgQD0VFJejw3D174vAYyd 6EC9IeDz0BRi3LfTyufmqqjkNL/D4qqSQR49VUdiBjbKY3ObEkbRuws61eVJoJSS lbhRrDEpuQE1R6e+QJWDKRbcXa8ONcJI/DAolgJ0DIfuyOLVu5IlIGe/KBCYxvUX U8WUJlbFfbQgLzS3ZSMsvOOBWwKBgQDhfkLoV2WIVOp9JEC0DD9rvd3yC6jGZT+C wtS84WiRioj5lOYTT1iOlhcc3BVBI0mqq3hioLRY1QoAclvLYlD96gIUf3FcjkS8 Yez9az0/s0F5V9A4q5ILXh2+y62So1EEHUkymkwJPtwpORWV+EakG7vQ7g6P8JhG yddWmnbbVwKBgQC/lndYiphin4QUXASltf89z5kT1nCF7UmAnDUoHV5+RBazRcQ3 FzTdJ0foR7MjFMUMLlK2FxOBOUSobXDTWO/Fq16JtvaJjvysJPyYctnoRtYEMId+ r7IbwTV/Rmw5A/FLY9//mN+Bd6s8AZciiZ/+wel8x0s9iYau4HGqnRtQzQKBgCQm xP1Q/bM0wf9cL49uI0DXyNyEaAOeuebx6394t/YVes5gw942q2D4yS3UTwgJa0cU hJFzaFaRmS/nJbZexdNfkAPPRtJq8LQvEvqyFbi/uXCF1pkvUJPH/AbZyrMmwddi Bpk5SZV14YAuabqIenLXC258rBMBpLg8pex5iTKzAoGAefpjvdwex4c3UevW6fuP W8NtSKLVs4iIhUp6JSzYMptRktiLgs+KEQcXVz1/c34DqwPmngDZQx8P7g7o0DiS /rYvjR3oj+5FLZS8JCo+Dbb7L9IHKCrnEl9VVIK38UH41TNyOmJHefnT7NeEOJP+ /c0LvaSM8Dg0CtqZP4M0hUc= -----END PRIVATE KEY----- PKCS7 Encrypted data: PBES2, PBKDF2, AES-256-CBC, Iteration 10000, PRF hmacWithSHA256 Certificate bag Bag Attributes friendlyName: ca localKeyID: 54 69 6D 65 20 31 36 34 38 33 38 38 32 37 34 39 31 30 subject=CN = Elastic Certificate Tool Autogenerated CA issuer=CN = Elastic Certificate Tool Autogenerated CA -----BEGIN CERTIFICATE----- MIIDSTCCAjGgAwIBAgIUEFAezZP+HRGBy2mNE4hIWTa8Oq8wDQYJKoZIhvcNAQEL BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l cmF0ZWQgQ0EwHhcNMjIwMzI3MTMzNzUzWhcNMzIwMzI0MTMzNzUzWjA0MTIwMAYD VQQDEylFbGFzdGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANc2ncEjVhfarHPqHuy8sCRO VIyK2lnOBXkOWTZlMrMpxMTFVUu8vTO87kkl8XB9Z4982FnIhFewNHxKbCtGqve7 KwAv3PKpLC8alFmU+aXRri3x4Rgc317BXmnZfO6vbZKEB60naxD8Cz3SWwwQpfcD suCk4RYxsGtql1w1a3lACc46VeevAK8+Zad3l+uJBq2aCBLb92Z/DlXYR45CKZKF GdyiG1yP17PzRZyUBMh+RnHXH6bxukVBWme33hHDVrnyTi7Lr950vpbpEmMlhrf0 9WCNqo1k0Z8gCXZJMN9A7Idunr/cFkOYmO3x7SAYeEYozDVKa4lG8ToICy7rzu0C AwEAAaNTMFEwHQYDVR0OBBYEFEf8Qo2RRA4G+mtv1ZFwvGHFAT3zMB8GA1UdIwQY MBaAFEf8Qo2RRA4G+mtv1ZFwvGHFAT3zMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBAHGFaYHdSRtZnAujnU2EILin0uACtXsaLPJGpT/U42wZFcIQ RA0RV2eDa5aVxRY/Ir1BSH9e9vQDRXmOkGAA/5hUytZPkttoYex+tS7fZVkS5qPv tPIVVa93BkQ6Ml8aUcbyhGTgwFbeGU2TWyBZAlPA753SZzBjnmH3mX+suh4Hy3Fd cLuUnWdaEqEAOBq4DqEITrxBQL07OXhkengyYGj7OzfDGvogdwuNgfTDJGSo+0NW RaATvyG0DEFHrcDE78RNvqvSwvOr20L+cSrniWz+22/swDh1JhhPQiUYx0+us+7P cssV3qzHu/7I87trfV56QnNNv4z2OUslz6dztPw= -----END CERTIFICATE----- |
패스워드를 입력하지 않았기 때문에 패스워드 입력 문구에서는 그냥 Enter 를 치면 된다. 그러면 위와같이 Private Key, Certificate 내용이 나온다. Certificate 부분을 따로 때어내서 파일로 저장하고 Openssl 명령어를 이용해 인증서를 읽으면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
]# openssl x509 -text -in a.crt -noout Certificate: Data: Version: 3 (0x2) Serial Number: 10:50:1e:cd:93:fe:1d:11:81:cb:69:8d:13:88:48:59:36:bc:3a:af Signature Algorithm: sha256WithRSAEncryption Issuer: CN = Elastic Certificate Tool Autogenerated CA Validity Not Before: Mar 27 13:37:53 2022 GMT Not After : Mar 24 13:37:53 2032 GMT Subject: CN = Elastic Certificate Tool Autogenerated CA ............. X509v3 extensions: X509v3 Subject Key Identifier: 47:FC:42:8D:91:44:0E:06:FA:6B:6F:D5:91:70:BC:61:C5:01:3D:F3 X509v3 Authority Key Identifier: keyid:47:FC:42:8D:91:44:0E:06:FA:6B:6F:D5:91:70:BC:61:C5:01:3D:F3 X509v3 Basic Constraints: critical CA:TRUE Signature Algorithm: sha256WithRSAEncryption |
CA:TRUE 라고 명백하게 나오고 있다.
그러면 CA 인증서를 가지고 만들어진 /usr/share/elasticsearch/elastic-certificates.p12 파일도 내용을 확인해 보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
]# openssl pkcs12 -info -nodes -in elastic-certificates.p12 Enter Import Password: MAC: sha256, Iteration 10000 MAC length: 32, salt length: 20 PKCS7 Data Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 10000, PRF hmacWithSHA256 Bag Attributes friendlyName: instance localKeyID: 54 69 6D 65 20 31 36 34 38 33 38 38 37 36 38 38 31 38 Key Attributes: <No Attributes> -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCW5PK+nx1yvbR+ zvmQLdx/XlVuQAXBKDhbedWtaxp3FRHUKi+VHEuD14fiNeJFuLdvlxB3xdVO5uZ4 VQW8Z0floUPc5g2z09tIxsbYtpQoIH0EwFt3HrVF3gMOgLnagDV+ulpIHVKSJo9J tma65HCAM0dOJ06bFtKJKvjMa1SLp3BneluVAQBqyzIKOFR0jNBK20pW53qyv1cX c51PdpLjoXLszAycUZt0dlyOFDb8jwg4TeneNeOsHeQ8+Dm/AtDvzfpZToM9K3Er IUtXvGiCXBArk8jDVAxk7kosoVc19tDvMVT7alF1XeIQCXi0a2LCGzOaHqq1+iEk De7AvX4pAgMBAAECggEAR+bDpsKSGTU9Nzmv4JyB161fPwBB3bcpF6m4AIErJLhE /Ri3ALHxZ9sBdHChqABrZECTB8ecq5LKGmfFKm/6afjMqgtzVw+qC4Uwhl6FvZMx j1yLmPjofujaAwSiyvPRydfJolhamqrGF2VTkVW+J9CHdz2yrqMS4mq4EExKhpqg 2zGGuON49a/IIxvfD5aMBOnE8C8EYpqhQgJlwQ5ZUJGpJJ6V9k8/kvIwjlyjdCFg B6/DAyRvFjA0519Z/yaeKONFFwJoZRB1o/eZ7R0HByO57V6OkeR93zjYkD46mEft 0IVdwZ5NLNCqoHPnCD23LI5yRjlf9gIlIYPastjL0wKBgQDGi3MXmQHBhuT2HB77 H0+cq8nSWr9zy5GNDdXrerijtdZ/Kw9Kw7oMzm67RSfbIm/a/4wEjIVB0mYD8GCd 5bZ+mBe+/OnttuNmSD9isnO0mZSFcijJpKbi8ccO1b5ZVfPGYXwOcheeKKoga95g vibMVfTbo1uRz5OvPrinK52P0wKBgQDCj3i5xuY7V+w0E9+pKGa0lkL4qvaUB00a 9qlqRSWqCE8snQKRUR/RwLo0Cu1RxmIeBMgvkvjpvRkQAkEBgfrjSgW5fdoCAyhC M0/GQCy4DlGHMtIvUoamvaS2/vf8uBbUXQuhnMFM8Fc1qmTqcHbJWiesSqjdAUE4 7drNECN4kwKBgQCsfOn4Tk1gPDkeN0ATGxinG/eycHRzvR8uVB7M/Uj7sTYwNNCM O46fIZjByUre7gQPVoPmT85VaNyH/4Vwp+jsAmZe3oq8om7cpVer/yzWcba+WHdm 90ylTTeKg9di9XFbn8WPJz+tf9aNZClGEuzSCLs5NaqP+q5rSSpS0WmJUQKBgBHk ddrH4uZ0OIG1ji0VTRSweOo7dr+4SCwBoSTnxQX1C6rzqYfJqR52FemxU4/gqadP E0Xkw0VjoYlqW6YS2QrMBOjBHSpwNeSYqW52+mXW00KWtuOpOD7fU+WMXyv7lgXj pK0xKEm2FJ8X034H57SuuNVMbGkes2vT2/pd0JVHAoGAPYagEKewTvmGyeJmgKip yiR9EkrUEDYojnhxmVlX5tmhKDGle7v3janSBzFhi9TmdxNTJgbgMpXwYbLNTmXr bazP5iBnY92ewz0q2ZlseLacW+Nk0OiOW7F5oXQNpWsM5WhMtzVmv+ziXzcHsVEZ 7nO7ClRZphJgPHMYFgO4QCI= -----END PRIVATE KEY----- PKCS7 Encrypted data: PBES2, PBKDF2, AES-256-CBC, Iteration 10000, PRF hmacWithSHA256 Certificate bag Bag Attributes friendlyName: instance localKeyID: 54 69 6D 65 20 31 36 34 38 33 38 38 37 36 38 38 31 38 subject=CN = instance issuer=CN = Elastic Certificate Tool Autogenerated CA -----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIVAINRWc0x/M3gJc+8nmj/vzjUw29CMA0GCSqGSIb3DQEB CwUAMDQxMjAwBgNVBAMTKUVsYXN0aWMgQ2VydGlmaWNhdGUgVG9vbCBBdXRvZ2Vu ZXJhdGVkIENBMB4XDTIyMDMyNzEzNDYwN1oXDTI1MDMyNjEzNDYwN1owEzERMA8G A1UEAxMIaW5zdGFuY2UwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCW 5PK+nx1yvbR+zvmQLdx/XlVuQAXBKDhbedWtaxp3FRHUKi+VHEuD14fiNeJFuLdv lxB3xdVO5uZ4VQW8Z0floUPc5g2z09tIxsbYtpQoIH0EwFt3HrVF3gMOgLnagDV+ ulpIHVKSJo9Jtma65HCAM0dOJ06bFtKJKvjMa1SLp3BneluVAQBqyzIKOFR0jNBK 20pW53qyv1cXc51PdpLjoXLszAycUZt0dlyOFDb8jwg4TeneNeOsHeQ8+Dm/AtDv zfpZToM9K3ErIUtXvGiCXBArk8jDVAxk7kosoVc19tDvMVT7alF1XeIQCXi0a2LC GzOaHqq1+iEkDe7AvX4pAgMBAAGjTTBLMB0GA1UdDgQWBBQYiUKf9pN3pVQTXyC/ JMFT3MTthTAfBgNVHSMEGDAWgBRH/EKNkUQOBvprb9WRcLxhxQE98zAJBgNVHRME AjAAMA0GCSqGSIb3DQEBCwUAA4IBAQDSKsLkcTLwJYxeAOfbONzGUb5dipJBVRMH L7YIRWtozi5vG8yNlug+ISPy5rwS9RpjDyDHq+DVEX2JqLhEym11sAbEJb0cyVr3 z3bve4ut3HubIfdI51cq2c2Fa3uTCaha30qKR7WCYF1DkFg4bCAd0gK29/M6NUD/ vWmLj83PIhqsuxwnlW25bBgTES8kdIykScdQqKs3C+rN8trzMdahjSya1qrhJh32 kDOjZYM9gQ76+VY41FMwd/7ZEuX0swzymWHPTsba2IH1frbR3QLE4YyVtgjHlfk7 Du/tN1cuUs32N1N+C2fdDtDKfZlWts4e2bdQiV+iFRnoyuMuU2JN -----END CERTIFICATE----- Certificate bag Bag Attributes friendlyName: ca 2.16.840.1.113894.746875.1.1: <Unsupported tag 6> subject=CN = Elastic Certificate Tool Autogenerated CA issuer=CN = Elastic Certificate Tool Autogenerated CA -----BEGIN CERTIFICATE----- MIIDSTCCAjGgAwIBAgIUEFAezZP+HRGBy2mNE4hIWTa8Oq8wDQYJKoZIhvcNAQEL BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l cmF0ZWQgQ0EwHhcNMjIwMzI3MTMzNzUzWhcNMzIwMzI0MTMzNzUzWjA0MTIwMAYD VQQDEylFbGFzdGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANc2ncEjVhfarHPqHuy8sCRO VIyK2lnOBXkOWTZlMrMpxMTFVUu8vTO87kkl8XB9Z4982FnIhFewNHxKbCtGqve7 KwAv3PKpLC8alFmU+aXRri3x4Rgc317BXmnZfO6vbZKEB60naxD8Cz3SWwwQpfcD suCk4RYxsGtql1w1a3lACc46VeevAK8+Zad3l+uJBq2aCBLb92Z/DlXYR45CKZKF GdyiG1yP17PzRZyUBMh+RnHXH6bxukVBWme33hHDVrnyTi7Lr950vpbpEmMlhrf0 9WCNqo1k0Z8gCXZJMN9A7Idunr/cFkOYmO3x7SAYeEYozDVKa4lG8ToICy7rzu0C AwEAAaNTMFEwHQYDVR0OBBYEFEf8Qo2RRA4G+mtv1ZFwvGHFAT3zMB8GA1UdIwQY MBaAFEf8Qo2RRA4G+mtv1ZFwvGHFAT3zMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBAHGFaYHdSRtZnAujnU2EILin0uACtXsaLPJGpT/U42wZFcIQ RA0RV2eDa5aVxRY/Ir1BSH9e9vQDRXmOkGAA/5hUytZPkttoYex+tS7fZVkS5qPv tPIVVa93BkQ6Ml8aUcbyhGTgwFbeGU2TWyBZAlPA753SZzBjnmH3mX+suh4Hy3Fd cLuUnWdaEqEAOBq4DqEITrxBQL07OXhkengyYGj7OzfDGvogdwuNgfTDJGSo+0NW RaATvyG0DEFHrcDE78RNvqvSwvOr20L+cSrniWz+22/swDh1JhhPQiUYx0+us+7P cssV3qzHu/7I87trfV56QnNNv4z2OUslz6dztPw= -----END CERTIFICATE----- |
위 내용을 보면, Private Key 1개, Certificate 2개 로 나온다. 이건 인증서 체인 파일인게 분명하다. Certificate 부분만 따로 때어서 보면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
]# ]# openssl x509 -text -in a.crt -noout Certificate: Data: Version: 3 (0x2) Serial Number: 83:51:59:cd:31:fc:cd:e0:25:cf:bc:9e:68:ff:bf:38:d4:c3:6f:42 Signature Algorithm: sha256WithRSAEncryption Issuer: CN = Elastic Certificate Tool Autogenerated CA Validity Not Before: Mar 27 13:46:07 2022 GMT Not After : Mar 26 13:46:07 2025 GMT Subject: CN = instance Subject Public Key Info: ......... X509v3 extensions: X509v3 Subject Key Identifier: 18:89:42:9F:F6:93:77:A5:54:13:5F:20:BF:24:C1:53:DC:C4:ED:85 X509v3 Authority Key Identifier: keyid:47:FC:42:8D:91:44:0E:06:FA:6B:6F:D5:91:70:BC:61:C5:01:3D:F3 X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption ]# ]# openssl x509 -text -in b.crt -noout Certificate: Data: Version: 3 (0x2) Serial Number: 10:50:1e:cd:93:fe:1d:11:81:cb:69:8d:13:88:48:59:36:bc:3a:af Signature Algorithm: sha256WithRSAEncryption Issuer: CN = Elastic Certificate Tool Autogenerated CA Validity Not Before: Mar 27 13:37:53 2022 GMT Not After : Mar 24 13:37:53 2032 GMT Subject: CN = Elastic Certificate Tool Autogenerated CA ... X509v3 extensions: X509v3 Subject Key Identifier: 47:FC:42:8D:91:44:0E:06:FA:6B:6F:D5:91:70:BC:61:C5:01:3D:F3 X509v3 Authority Key Identifier: keyid:47:FC:42:8D:91:44:0E:06:FA:6B:6F:D5:91:70:BC:61:C5:01:3D:F3 X509v3 Basic Constraints: critical CA:TRUE Signature Algorithm: sha256WithRSAEncryption |
확인 결과, 하나는 인증서이고 하나는 CA 인증서인 것으로 확인된다. 그러니까 elastic-certificate.p12 파일은 Private Key, CA 인증서, 서버 인증서 이렇게 3가지를 모두 가지는 파일이다.
PEM 형식 파일
Elasticsearch 에서는 PEM 형식의 파일도 함께 지원 한다. PEM 형식은 가장 흔하게, 널리 사용되는 인증서 파일 포맷 형식이다. elasticsearch-certutil 명령어를 이용해서 작성할 수 있다.
1 2 3 |
]# cd /usr/share/elasticsearch ]# ./bin/elasticsearch-certutil ca --days 3650 --pem --pass "" Please enter the desired output file [elastic-stack-ca.zip]: |
위와같이 zip 파일 형태로 생성된다. 압축을 해제하면 다음과 같이 파일이 생성된다.
1 2 3 4 5 |
]# unzip elastic-stack-ca.zip Archive: elastic-stack-ca.zip creating: ca/ inflating: ca/ca.crt inflating: ca/ca.key |
ca 디렉토리가 생성되는데, 보면 Private Key 파일과 CA 파일이 별도로 생성된 것을 알 수 있다.
이렇게 작성된 파일을 가지고 서버 인증서를 다음과 같이 생성할 수 있다.
1 2 3 4 |
]# ./bin/elasticsearch-certutil cert --ca-cert ca/ca.crt --ca-key ca/ca.key --pem "" Please enter the desired output file [certificate-bundle.zip]: Certificates written to /usr/share/elasticsearch/certificate-bundle.zip |
역시나 압축된 형태의 파일로 출력이 된다. 압축을 해제해 보자.
1 2 3 4 5 |
]# unzip certificate-bundle.zip Archive: certificate-bundle.zip creating: instance/ inflating: instance/instance.crt inflating: instance/instance.key |
instance.crt 인증서 파일의 내용을 살펴보자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
]# ]# openssl x509 -text -in instance.crt -noout Certificate: Data: Version: 3 (0x2) Serial Number: 1f:71:54:19:fd:db:46:08:5a:ea:6a:66:18:1f:1b:66:e1:b6:68:f9 Signature Algorithm: sha256WithRSAEncryption Issuer: CN = Elastic Certificate Tool Autogenerated CA Validity Not Before: Mar 27 14:02:26 2022 GMT Not After : Mar 26 14:02:26 2025 GMT Subject: CN = instance ... X509v3 extensions: X509v3 Subject Key Identifier: 33:F1:77:87:2A:CD:50:8A:77:01:A7:23:67:37:75:57:A5:F3:8A:3F X509v3 Authority Key Identifier: keyid:42:F7:D4:5A:70:8E:A5:99:ED:E1:3E:93:A4:F0:75:42:7D:7F:66:92 X509v3 Basic Constraints: CA:FALSE |
서버 인증서임을 알수 있다.
인증서 활용
PKCS#12 형식과 PEM 형식의 인증서를 활용하는 방법은 다르다.
PKCS#12 형식은 다음과 같이 설정 한다.
1 2 3 4 |
xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/elastic-certificates.p12 |
PEM 형식은 다음과 같다.
1 2 3 4 5 |
xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.key: /etc/elasticsearch/certs/instance/instance.key xpack.security.transport.ssl.certificate: /etc/elasticsearch/certs/instance/instance.crt xpack.security.transport.ssl.certificate_authorities: [ "/etc/elasticsearch/certs/ca/ca.crt" ] |
SAN 인증서
지금까지 설명한 방법으로 인증서를 작성할 경우에 한가지 문제가 있을 수 있다. 이 인증서들은 SAN 인증서가 아니기 때문에 모든 도메인에서 통용될 수 있다. 앞에 인증서 내용을 보면 SAN 이 없다. 하지만 SAN 인증서라야만 하는 보안성을 요구된다면 SAN 인증서를 만들어 사용해야 한다.
SAN 인증서를 작성할때에 주의 사항은 Elasticsearch Stack 에서 사용할 모든 도메인, 혹은 IP 주소를 기재해야 한다. 그렇지 않으면 절대로 통신을 할 수가 없게 된다.
먼저, CA 인증서가 필요하다. 이 CA 인증서는 앞에 PEM 형식의 CA 인증서를 만들고 압축을 해제해 놓는다. 그리고 다음과 같이 instance.yml 파일을 작성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
]# vim instance.yml instances: - name: "Elastic" ip: - 192.168.97.32 dns: - master.systemv.local - name: "kibana" ip: - 192.168.97.32 dns: - kibana.systemv.local - name: "logstash" ip: - 192.168.97.32 dns: - logstash.systemv.local |
이 파일에서 ip, dns 항목이 보이는데, 둘 중 하나만 있어도 된다. 어짜피 인증서에서 SAN 항목에서 IP Address, DNS 둘중하나가 들어가 있고 매칭이되면 인증서를 쓸 수 있다.
이제 다음과 같이 인증서를 작성해 생성한다.
1 |
]# ./bin/elasticsearch-certutil cert --ca-cert ca/ca.crt --ca-key ca/ca.key --pem --in instance.yml --out certs.zip |
정상적으로 생성이 되었을 것이다. 압축을 해제해 보자
1 2 3 4 5 6 7 8 9 10 11 |
]# unzip certs.zip Archive: certs.zip creating: master/ inflating: master/master.crt inflating: master/master.key creating: kibana/ inflating: kibana/kibana.crt inflating: kibana/kibana.key creating: logstash/ inflating: logstash/logstash.crt inflating: logstash/logstash.key |
instance.yml 파일에서 이름부분이 디렉토리로 생성되면서 각각 인증서와 key 값이 생성되어 있다. 이 인증서들은 SAN 부분이 instance.yml 에 따라서 하나의 IP, 하나의 DNS 만 들어가 있다.
SAN 이 뭔지를 안다면 굳이 이렇게 다 분리할 필요는 없다는 생각을 하게 된다. 멀티도메인 인증서를 사용하면 도메인에 *.systemv.local 처럼 생성하면 될 것이고, 그러면 하나의 인증서를 가지고 여러곳에서 함께 사용이 가능해 진다. 위 예제에서는 각각의 용도에 맞게 딱 1개의 도메인과 IP 에 한해서 허용하도록 작성되었을 뿐이다.
PEM 형식의 Key 는 PKCS#12 형식으로 사용해야할 때가 있다. 이때는 다음과 같이 openssl 명령어를 이용해서 변환할 수 있다.
1 |
]# openssl pkcs8 -in master.key -topk8 -nocrypt -out master.pkcs8.key |