trombik.opensearch
trombik.opensearch
Rol de ansible
para gestionar opensearch
.
El rol está en versión beta.
Para usuarios de FreeBSD
El ejemplo, no el rol en sí, requiere mi propio puerto deopensearch-dashboards
para FreeBSD, que se puede encontrar en
trombik/freebsd-ports-opensearch.
El ejemplo utiliza trombik.opensearch_dashboards
.
Sin embargo, el puerto y el rol dependen de www/node10
, que está fuera de soporte y
ha sido descontinuado.
Consulte Issue 835
para el plan de actualización.
Para usuarios de variantes de Debian y CentOS
El rol instala opensearch
desde el archivo tar oficial. Esto
es una solución provisional hasta que Amazon o las distribuciones lancen paquetes.
Las variables del rol relacionadas con la instalación desde la fuente, opensearch_src_*
, no están
documentadas intencionalmente.
El rol no instala el paquete JDK. En su lugar, se utiliza el JDK incluido.
El rol importa una clave PGP en el llavero de root
desde el proyecto de origen para
verificar el archivo tar. Si sabe cómo verificar un archivo firmado sin importar
la clave PGP, hágamelo saber.
Algunos complementos aún no funcionan.
Los cambios respecto a la configuración por defecto incluyen:
- El archivo de registro está en
/var/log/opensearch
- La aplicación se instala en
opensearch_root_dir
. El valor por defecto es/usr/local/opensearch-dashboards
- El usuario que ejecuta la aplicación es
opensearch
Los cambios se actualizarán cuando un paquete oficial esté disponible.
El rol descarga el archivo tar oficial en opensearch_src_dir
. El
valor por defecto es /var/dist
. Este directorio no es solo un caché. Además del
archivo tar, contiene una clave PGP, un archivo de firma y archivos para
controlar las tareas de ansible
.
El rol instala un archivo de unidad systemd
para opensearch
. El autor no es un
experto en systemd
de ninguna manera.
Requisitos
Por defecto, el rol utilizatrombik.x509_certificate
para gestionar certificados X509. El rol no enumera trombik.x509_certificate
como una dependencia porque TLS no es obligatorio.
Variables del Rol
Variable | Descripción | Por defecto |
---|---|---|
opensearch_user |
nombre de usuario de opensearch |
{{ __opensearch_user }} |
opensearch_group |
nombre del grupo de opensearch |
{{ __opensearch_group }} |
opensearch_log_dir |
ruta al directorio de registros | {{ __opensearch_log_dir }} |
opensearch_db_dir |
ruta al directorio de datos | {{ __opensearch_db_dir }} |
opensearch_scripts_dir |
ruta al directorio de scripts | {{ __opensearch_scripts_dir }} |
opensearch_plugins_dir |
ruta al directorio de complementos | {{ __opensearch_plugins_dir }} |
opensearch_plugin_command |
ruta al comando opensearch-plugin |
{{ __opensearch_plugin_command }} |
opensearch_plugins |
una lista de complementos (ver abajo) | [] |
opensearch_service |
nombre del servicio de opensearch |
{{ __opensearch_service }} |
opensearch_package |
nombre del paquete de opensearch |
{{ __opensearch_package }} |
opensearch_conf_dir |
ruta al directorio de configuración | {{ __opensearch_conf_dir }} |
opensearch_jvm_options |
opciones de JVM (ver el ejemplo de playbook) | "" |
opensearch_conf_file |
ruta a opensearch.yml |
{{ opensearch_conf_dir }}/opensearch.yml |
opensearch_flags |
banderas adicionales para los scripts de inicio | "" |
opensearch_config |
el contenido de opensearch.yml |
"" |
opensearch_config_log4j2_properties |
el contenido de log4j2.properties |
"" |
opensearch_http_host |
dirección o hostname de opensearch . Esta dirección debe ser accesible desde el controlador ansible (el host en el que se ejecuta ansible ). El valor se utiliza para el acceso a la API, por lo tanto, debe coincidir con el nombre común del certificado cuando se usa TLS y se habilita la verificación del host remoto. De lo contrario, las llamadas a la API en el rol fallarán. |
localhost |
opensearch_http_port |
puerto de escucha de opensearch . Este puerto debe ser accesible desde el controlador ansible (el host en el que se ejecuta ansible ) |
9200 |
opensearch_http_url |
URL de la interfaz HTTP. Esta URL debe ser accesible desde el controlador ansible |
https://{{ opensearch_http_host }}:{{ opensearch_http_port }} |
opensearch_http_auth |
detalles de autenticación para el acceso a la API, ver abajo | {} |
opensearch_java_home |
variable de entorno JAVA_HOME |
{{ __opensearch_java_home }} |
opensearch_extra_plugin_files |
una lista de archivos adicionales para complementos (ver abajo) | [] |
opensearch_include_role_x509_certificate |
si es verdadero, incluir trombik.x509_certificate durante el play (trombik.x509_certificate debe estar enumerado en requirements.yml ) |
yes |
opensearch_x509_certificate_vars |
variable para pasar a trombik.x509_certificate |
{} |
opensearch_wait_for_cluster_status |
esperar que el estado del clúster sea este valor después de iniciar el servicio. los valores válidos incluyen red , yellow , green , y false . establecer el valor false para deshabilitar |
no |
opensearch_wait_for_cluster_status_timeout |
tiempo de espera al esperar que el estado del clúster sea opensearch_wait_for_cluster_status |
10s |
opensearch_wait_for_cluster_status_retry |
reintentar al esperar que el estado del clúster sea opensearch_wait_for_cluster_status |
3 |
opensearch_plugins
Esta es una lista de complementos. Un elemento de la lista es un dict.
Clave | Descripción | ¿Obligatorio? |
---|---|---|
name |
nombre del complemento | sí |
src |
la fuente del complemento, por lo general una URL | no |
opensearch_extra_plugin_files
Esta variable es una lista de archivos para complementos. Un elemento de la lista es un dict.
Clave | Descripción | ¿Obligatorio? |
---|---|---|
path |
ruta relativa al archivo desde opensearch_plugins_dir |
sí |
type |
ya sea yaml o raw . cuando el tipo es yaml , el valor de content se procesa como YAML. cuando el tipo es raw , el valor de content se procesa tal cual. cuando el valor de state se omite o es present , type debe ser especificada. |
no |
mode |
modo del archivo | no |
owner |
propietario del archivo | no |
group |
grupo del archivo | no |
state |
ya sea present o absent . present crea el archivo. absent elimina el archivo. el valor por defecto es present |
no |
content |
el contenido del archivo (ver también type arriba) |
no |
post_command |
un dict para ansible.builtin.command |
no |
post_command
es un dict para ejecutar un comando después de que se haya cambiado el estado del elemento. La variable se pasa a ansible.builtin.command
(no a ansible.builtin.shell
).
Acepta las siguientes claves:
Clave | Descripción | ¿Obligatorio? |
---|---|---|
cmd |
El comando a ejecutar | sí |
args |
Un dict para args . Actualmente se admiten chdir , creates y removes . |
no |
enabled |
Ya sea yes o no . Cuando yes , se ejecuta el comando, cuando no no |
sí |
post_command
está diseñado principalmente para securityadmin.sh
.
Consulte
Aplicar cambios usando securityadmin.sh
para más detalles. Utilice enabled
para ejecutar securityadmin.sh
en un nodo específico.
opensearch_http_auth
Esta variable es un dict, utilizada como credenciales de usuario al acceder a los
puntos finales de la API en opensearch_http_url
.
Clave | Descripción | ¿Obligatorio? |
---|---|---|
client_cert |
Ruta a la clave pública del cliente en formato PEM . Cuando es una ruta relativa, la ruta es relativa al directorio de trabajo en el controlador ansible , NO en la máquina destino. |
no |
client_key |
Ruta a la clave secreta del cliente en formato PEM . Cuando es una ruta relativa, la ruta es relativa al directorio de trabajo en el controlador ansible , NO en la máquina destino. |
no |
ca_path |
Ruta a la clave pública de la CA en formato PEM . Cuando es una ruta relativa, la ruta es relativa al directorio de trabajo en el controlador ansible , NO en la máquina destino. |
no |
url_username |
Nombre de usuario para la autenticación básica | no |
url_password |
Contraseña para la autenticación básica | no |
validate_certs |
verificar el certificado remoto | no |
El rol pasa la variable aluri
módulo.
ca_path
se agregó en la versión ansible
2.11. client_cert
y client_key
se agregaron en la versión ansible
2.4. Asegúrese de que su versión de ansible
soporte
las claves. Como resultado, no puede usar validate_certs: yes
cuando su
versión de ansible
es anterior a 2.11 y el certificado no está firmado por
una CA en el paquete CA predeterminado (en muchos casos, querrá tener su propia CA para
firmar certificados debido a costos financieros).
Tenga en cuenta que las llamadas a la API se realizan desde el controlador ansible
.opensearch_http_url
debe ser accesible desde el controlador ansible
.
Los archivos a los que apuntan client_cert
, client_key
y ca_path
deben estar en
el controlador ansible
.
Problemas conocidos con opensearch_http_auth
y TLS
opensearch
soporta autenticación básica y autenticación con certificado de cliente TLS.
Sin embargo, en algunas configuraciones, la llamada a la API falla.
La respuesta corta es: use autenticación básica sobre TLS con ca_path
. Esta es
la única configuración que funciona de manera segura como se esperaba.
Para usar autenticación de cliente TLS sin nombre de usuario y contraseña,
debe establecer validate_certs
en no
. Aquí está la matriz de pruebas y los resultados.
Método de autenticación | valor de validate_certs |
¿con ca_path ? |
Resultado |
---|---|---|---|
Certificado de cliente TLS | no |
Sí | Éxito |
Certificado de cliente TLS | no |
No | Éxito |
Certificado de cliente TLS | yes |
Sí | Fallo |
Certificado de cliente TLS | yes |
No | Fallo (esto es esperado ya que el cliente no puede validar sin certificado CA) |
Básica | no |
Sí | Éxito |
Básica | no |
No | Éxito |
Básica | yes |
Sí | Éxito |
Básica | yes |
No | Fallo (esto es esperado ya que el cliente no puede validar sin certificado CA) |
Esto podría ser un error en el módulo uri
de ansible
porque curl
funciona bien en
tanto la certificación de cliente TLS como la autenticación básica sobre TLS. Para
registro, se utilizaron los siguientes comandos.
curl -vv --cacert /usr/local/etc/opensearch/root-ca.pem \
--cert /usr/local/etc/opensearch/admin.pem \
--key /usr/local/etc/opensearch/admin-key.pem \
https://localhost:9200
curl -vv --user admin:admin \
--cacert /usr/local/etc/opensearch/root-ca.pem \
https://localhost:9200
Debian
Variable | Por defecto |
---|---|
__opensearch_user |
opensearch |
__opensearch_group |
opensearch |
__opensearch_log_dir |
/var/log/opensearch |
__opensearch_db_dir |
/var/lib/opensearch |
__opensearch_package |
opensearch |
__opensearch_conf_dir |
/usr/local/opensearch/config |
__opensearch_root_dir |
/usr/local/opensearch |
__opensearch_scripts_dir |
"" |
__opensearch_plugins_dir |
/usr/local/opensearch/plugins |
__opensearch_plugin_command |
/usr/local/opensearch/bin/opensearch-plugin |
__opensearch_service |
opensearch |
__opensearch_java_home |
/usr/local/opensearch/jdk |
FreeBSD
Variable | Por defecto |
---|---|
__opensearch_user |
opensearch |
__opensearch_group |
opensearch |
__opensearch_log_dir |
/var/log/opensearch |
__opensearch_db_dir |
/var/db/opensearch |
__opensearch_package |
textproc/opensearch |
__opensearch_conf_dir |
/usr/local/etc/opensearch |
__opensearch_scripts_dir |
"" |
__opensearch_plugins_dir |
/usr/local/lib/opensearch/plugins |
__opensearch_plugin_command |
/usr/local/lib/opensearch/bin/opensearch-plugin |
__opensearch_service |
opensearch |
__opensearch_java_home |
/usr/local |
RedHat
Variable | Por defecto |
---|---|
__opensearch_user |
opensearch |
__opensearch_group |
opensearch |
__opensearch_log_dir |
/var/log/opensearch |
__opensearch_db_dir |
/var/lib/opensearch |
__opensearch_package |
opensearch |
__opensearch_conf_dir |
/usr/local/opensearch/config |
__opensearch_root_dir |
/usr/local/opensearch |
__opensearch_scripts_dir |
"" |
__opensearch_plugins_dir |
/usr/local/opensearch/plugins |
__opensearch_plugin_command |
/usr/local/opensearch/bin/opensearch-plugin |
__opensearch_service |
opensearch |
__opensearch_java_home |
/usr/local/opensearch/jdk |
Dependencias
trombik.x509_certificate
cuandoopensearch_include_role_x509_certificate
es verdadero
Ejemplo de Playbook
Un ejemplo para instalar:
opensearch
opensearch-dashboards
haproxy
fluentd
haproxy
es un proxy inverso para opensearch-dashboards
. Los registros de haproxy
y el daemon de syslog se envían a un listener syslog
local de fluentd
. Elfluentd
luego procesa los registros y los envía a opensearch
. El patrón
de índice es logstash-*
.
Tenga en cuenta que el complemento de salida elasticsearch
de fluentd
no admiteopensearch
. El ejemplo sortea el problema al:
- instalar versiones específicas del
fluentd-elasticsearch-plugin
y
gemas relacionadas conelasticsearch
- establecer
verify_es_version_at_startup
ydefault_elasticsearch_version
enfluentd.conf
Consulte Issue 915
para más detalles.
Utilice el usuario admin
con la contraseña admin
para iniciar sesión en los dashboards.
Para un ejemplo de clúster, consulte
tests/serverspec/cluster.yml.
---
- hosts: localhost
pre_tasks:
- name: Permitir puerto HTTP
ansible.builtin.iptables:
chain: INPUT
destination_port: 80
protocol: tcp
jump: ACCEPT
when: ansible_os_family == 'RedHat'
- name: Habilitar reenvío de syslog desde rsyslog
ansible.builtin.copy:
dest: /etc/rsyslog.d/fluentd.conf
content: |
*.*;syslog;auth,authpriv.none action(
Target="127.0.0.1"
type="omfwd"
Port="1514"
Protocol="udp"
template="RSYSLOG_SyslogProtocol23Format"
)
mode: "0644"
when:
- ansible_os_family == 'Debian' or ansible_os_family == 'RedHat'
register: __register_project_rsyslog_config
- name: Reiniciar rsyslog
ansible.builtin.service:
name: rsyslog
state: restarted
when:
- ansible_os_family == 'Debian' or ansible_os_family == 'RedHat'
- __register_project_rsyslog_config['changed']
- name: Habilitar reenvío de syslog desde syslogd
ansible.builtin.copy:
dest: /etc/syslog.d/fluentd.conf
content: |
*.* @127.0.0.1:1514
mode: "0644"
when: ansible_os_family == 'FreeBSD'
register: __register_project_syslog_config
- name: Habilitar syslog rfc5424
ansible.builtin.copy:
dest: /etc/rc.conf.d/syslogd
content: |
syslogd_flags="-s -O rfc5424"
mode: "0644"
when: ansible_os_family == 'FreeBSD'
register: __register_project_syslog_flags
- name: Reiniciar syslogd
ansible.builtin.service:
name: syslogd
state: restarted
when:
- ansible_os_family == 'FreeBSD'
- __register_project_syslog_config['changed'] or __register_project_syslog_flags['changed']
roles:
- role: trombik.freebsd_pkg_repo
when: ansible_os_family == "FreeBSD"
- name: trombik.apt_repo
when: ansible_os_family == 'Debian'
- name: trombik.redhat_repo
when: ansible_os_family == 'RedHat'
- role: trombik.java
# XXX se usa el jdk incluido en Ubuntu y CentOS
when: ansible_os_family == "FreeBSD"
- role: trombik.sysctl
- ansible-role-opensearch
- role: trombik.opensearch_dashboards
- role: trombik.fluentd
- role: trombik.haproxy
vars:
# XXX usar mi propio paquete ya que el paquete en el árbol oficial de paquetes
# está roto. tenga en cuenta que el paquete depende de node10, que está fuera de
# soporte y tiene vulnerabilidades.
freebsd_pkg_repo:
local:
enabled: "true"
url: "http://pkg.i.trombik.org/{{ ansible_distribution_version | regex_replace('\\.') }}{{ ansible_architecture }}-default-default"
mirror_type: none
priority: 100
state: present
os_opensearch_extra_packages:
FreeBSD: []
Debian:
- unzip
RedHat: []
opensearch_extra_packages: "{{ os_opensearch_extra_packages[ansible_os_family] }}"
os_java_packages:
FreeBSD:
- openjdk11
- jq
- vim
- tmux
- p5-ack
Debian:
- openjdk-11-jdk
RedHat:
- java-11-openjdk-devel
java_packages: "{{ os_java_packages[ansible_os_family] }}"
os_sysctl:
FreeBSD:
kern.maxfilesperproc: 65536
security.bsd.unprivileged_mlock: 1
Debian:
# vea https://opensearch.org/docs/latest/opensearch/install/important-settings/
vm.max_map_count: 262144
RedHat:
vm.max_map_count: 262144
sysctl: "{{ os_sysctl[ansible_os_family] }}"
opensearch_wait_for_cluster_status: yellow
os_opensearch_package:
FreeBSD: "{{ __opensearch_package }}"
Debian: "{{ __opensearch_package }}"
RedHat: opensearch-1.13.2
opensearch_package: "{{ os_opensearch_package[ansible_os_family] }}"
os_opensearch_flags:
FreeBSD: ""
Debian: |
ES_PATH_CONF={{ opensearch_conf_dir }}
ES_STARTUP_SLEEP_TIME=5
RedHat: |
ES_PATH_CONF={{ opensearch_conf_dir }}
ES_STARTUP_SLEEP_TIME=5
opensearch_flags: "{{ os_opensearch_flags[ansible_os_family] }}"
os_opensearch_jvm_options:
FreeBSD: ""
Debian: |
# vea opensearch-tar-install.sh
# /usr/bin/getconf CLK_TCK`
-Dclk.tck=100
-Djdk.attach.allowAttachSelf=true
-Djava.security.policy={{ opensearch_root_dir }}/plugins/opensearch-performance-analyzer/pa_config/opensearch_security.policy
RedHat: |
# /usr/bin/getconf CLK_TCK`
-Dclk.tck=100
-Djdk.attach.allowAttachSelf=true
-Djava.security.policy={{ opensearch_root_dir }}/plugins/opensearch-performance-analyzer/pa_config/opensearch_security.policy
os_opensearch_http_auth:
FreeBSD:
url_username: admin
url_password: admin
ca_path: "{{ role_path }}/files/test/certs/root-ca.pem"
validate_certs: yes
Debian:
client_cert: "{{ role_path }}/files/test/certs/admin.pem"
client_key: "{{ role_path }}/files/test/certs/admin-key.pem"
# XXX la versión de ansible en Ubuntu es 2.9.6. como tal, ca_path
# no se puede usar.
validate_certs: no
RedHat:
client_cert: "{{ role_path }}/files/test/certs/admin.pem"
client_key: "{{ role_path }}/files/test/certs/admin-key.pem"
validate_certs: no
opensearch_http_auth: "{{ os_opensearch_http_auth[ansible_os_family] }}"
opensearch_jvm_options: "{{ lookup('file', 'test/jvm_options') + os_opensearch_jvm_options[ansible_os_family] }}"
opensearch_config:
discovery.type: single-node
network.publish_host: ["10.0.2.15"]
path.data: "{{ opensearch_db_dir }}"
http.port: "{{ opensearch_http_port }}"
path.logs: "{{ opensearch_log_dir }}"
node.data: "true"
http.compression: "true"
network.host:
- "{{ opensearch_http_host }}"
- _site_
cluster.name: testcluster
node.name: testnode
http.cors.enabled: "true"
http.cors.allow-origin: "*"
http.cors.max-age: 86400
http.cors.allow-methods: "OPTIONS, HEAD, GET, POST, PUT, DELETE"
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length"
http.cors.allow-credentials: "true"
# _________________________TLS
plugins.security.ssl.transport.pemcert_filepath: node.pem
plugins.security.ssl.transport.pemkey_filepath: node-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
plugins.security.ssl.transport.enforce_hostname_verification: false
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: node.pem
plugins.security.ssl.http.pemkey_filepath: node-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: root-ca.pem
plugins.security.allow_unsafe_democertificates: true
plugins.security.allow_default_init_securityindex: true
plugins.security.authcz.admin_dn:
# XXX usar CN diferente para admin_dn y nodes_dn. cuando admin_dn ==
# nodes_dn, eso es un error.
- CN=Admin,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU
plugins.security.nodes_dn:
- CN=localhost,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU
plugins.security.advanced_modules_enabled: false
plugins.security.audit.type: internal_opensearch
plugins.security.enable_snapshot_restore_privilege: true
plugins.security.check_snapshot_restore_write_privileges: true
plugins.security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
plugins.security.system_indices.enabled: true
plugins.security.system_indices.indices: [".opendistro-alerting-config", ".opendistro-alerting-alert*", ".opendistro-anomaly-results*", ".opendistro-anomaly-detector*", ".opendistro-anomaly-checkpoints", ".opendistro-anomaly-detection-state", ".opendistro-reports-*", ".opendistro-notifications-*", ".opendistro-notebooks", ".opendistro-asynchronous-search-response*"]
plugins.security.disabled: false
cluster.routing.allocation.disk.threshold_enabled: false
project_security_plugin_dir: "{{ opensearch_plugins_dir }}/opensearch-security"
project_securityadmin_bin: "{{ project_security_plugin_dir }}/tools/securityadmin.sh"
project_security_plugin_post_command:
cmd: "{{ project_securityadmin_bin }} -icl -nhnv -cacert {{ opensearch_conf_dir }}/root-ca.pem -cert {{ opensearch_conf_dir }}/admin.pem -key {{ opensearch_conf_dir }}/admin-key.pem"
args:
chdir: "{{ project_security_plugin_dir }}/securityconfig"
enabled: "{% if 1 == 1 %}yes{% else %}no{% endif %}"
opensearch_plugins: []
opensearch_extra_plugin_files:
- path: opensearch-security/securityconfig/action_groups.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/action_groups.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/audit.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/audit.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/config.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/config.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/internal_users.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/internal_users.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/nodes_dn.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/nodes_dn.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/roles.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/roles.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/roles_mapping.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/roles_mapping.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/tenants.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/tenants.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/whitelist.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/whitelist.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
opensearch_config_log4j2_properties: "{{ lookup('file', 'test/log4j2_properties') }}"
x509_certificate_debug_log: yes
# XXX estas claves fueron creadas por los siguientes pasos descritos en:
# https://opensearch.org/docs/latest/security-plugin/configuration/generate-certificates/
#
# aquí hay una copia de los pasos:
#
# CA Raíz
# openssl genrsa -out root-ca-key.pem 2048
# openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem
#
# Certificado de Administrador
# openssl genrsa -out admin-key-temp.pem 2048
# openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
# openssl req -new -key admin-key.pem -out admin.csr
# openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem
#
# Certificado de Nodo
# openssl genrsa -out node-key-temp.pem 2048
# openssl pkcs8 -inform PEM -outform PEM -in node-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node-key.pem
# openssl req -new -key node-key.pem -out node.csr
# openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem
#
# Limpieza
# rm admin-key-temp.pem admin.csr node-key-temp.pem node.csr
#
# vea files/test/certs/Makefile para automatizar estos pasos.
x509_certificate:
- name: node
state: present
public:
path: "{{ opensearch_conf_dir }}/node.pem"
mode: "0444"
key: "{{ lookup('file', 'test/certs/node.pem') }}"
secret:
path: "{{ opensearch_conf_dir }}/node-key.pem"
owner: "{{ opensearch_user }}"
group: "{{ opensearch_group }}"
mode: "0600"
key: "{{ lookup('file', 'test/certs/node-key.pem') }}"
- name: root-ca
state: present
public:
path: "{{ opensearch_conf_dir }}/root-ca.pem"
key: "{{ lookup('file', 'test/certs/root-ca.pem') }}"
secret:
path: "{{ opensearch_conf_dir }}/root-ca-key.pem"
owner: "{{ opensearch_user }}"
group: "{{ opensearch_group }}"
key: "{{ lookup('file', 'test/certs/root-ca-key.pem') }}"
- name: admin
state: present
public:
path: "{{ opensearch_conf_dir }}/admin.pem"
key: "{{ lookup('file', 'test/certs/admin.pem') }}"
secret:
path: "{{ opensearch_conf_dir }}/admin-key.pem"
owner: "{{ opensearch_user }}"
group: "{{ opensearch_group }}"
key: "{{ lookup('file', 'test/certs/admin-key.pem') }}"
# _____________________________________________dashboards de opensearch
opensearch_dashboards_config:
server.host: "{{ opensearch_dashboards_bind_address }}"
server.port: "{{ opensearch_dashboards_bind_port }}"
server.name: "OpenSearch Dashboards"
# XXX corregir la ruta al registro en el paquete de FreeBSD
logging.dest: "{% if ansible_os_family == 'FreeBSD' %}/var/log/opensearch_dashboards.log{% else %}{{ opensearch_dashboards_log_file }}{% endif %}"
logging.verbose: true
opensearch.hosts: ["https://localhost:9200"]
path.data: "{{ opensearch_dashboards_data_dir }}"
opensearch.ssl.verificationMode: none
opensearch.username: "kibanaserver"
opensearch.password: "kibanaserver"
opensearch_security.multitenancy.enabled: true
opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"]
opensearch_security.readonly_mode.roles: ["kibana_read_only"]
# Utilice esta configuración si está ejecutando kibana sin https
opensearch_security.cookie.secure: false
# _____________________________________________haproxy
project_backend_host: 127.0.0.1
project_backend_port: 5601
os_haproxy_selinux_seport:
FreeBSD: {}
Debian: {}
RedHat:
ports:
- 80
- 5601
proto: tcp
setype: http_port_t
haproxy_selinux_seport: "{{ os_haproxy_selinux_seport[ansible_os_family] }}"
haproxy_config: |
global
daemon
{% if ansible_os_family != 'RedHat' %}
# aumentar la longitud máxima de línea de 1024 a 65535. esto trunca
# los registros cuando son más largos que este valor.
log 127.0.0.1:5140 len 65535 format rfc3164 local0 info
{% else %}
# XXX haproxy 1.x no entiende `format`.
log 127.0.0.1:5140 len 65535 local2
log-send-hostname
{% endif %}
{% if ansible_os_family == 'FreeBSD' %}
# El paquete de FreeBSD no proporciona por defecto
maxconn 4096
user {{ haproxy_user }}
group {{ haproxy_group }}
{% elif ansible_os_family == 'Debian' %}
chroot {{ haproxy_chroot_dir }}
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user {{ haproxy_user }}
group {{ haproxy_group }}
# Ubicaciones de material SSL predeterminadas
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Ver: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
{% elif ansible_os_family == 'OpenBSD' %}
maxconn 1024
chroot {{ haproxy_chroot_dir }}
uid 604
gid 604
pidfile /var/run/haproxy.pid
{% elif ansible_os_family == 'RedHat' %}
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
{% endif %}
defaults
log global
mode http
timeout connect 5s
timeout client 10s
timeout server 10s
retries 3
maxconn 2000
{% if ansible_os_family == 'Debian' %}
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
{% elif ansible_os_family == 'OpenBSD' %}
option redispatch
{% endif %}
frontend http-in
bind *:80
default_backend servers
unique-id-format %{+X}o\ %ci:%cp_%fi:%fp_%Ts_%rt:%pid
{% if ansible_os_family != 'RedHat' %}
http-request capture req.fhdr(Host) len 128
http-request capture req.fhdr(Referer) len 1024
http-request capture req.fhdr(User-Agent) len 1024
http-request capture req.fhdr(Accept) len 1024
{% else %}
capture request header Host len 128
capture request header Referer len 1024
capture request header User-Agent len 1024
capture request header Accept len 1024
{% endif %}
# formato de registro personalizado en JSON.
# para crear su propia estructura JSON:
#
# cd files/test/haproxy
# ruby ./yaml2logformat.rb log.yml
#
# note que la salida incluye el formato de registro entre comillas simples. sin embargo,
# las comillas simples deben ser eliminadas cuando la versión de haproxy es 1.x.
# por ejemplo, cuando la salida es:
#
# log-format '{"bytes_read":%B}'
#
# utilice esto en su lugar:
# log-format {"bytes_read":%B}
#
# consulte las variables disponibles en:
# 8.2.4. Formato de registro personalizado
# https://www.haproxy.com/documentation/hapee/latest/onepage/#8.2.4
#
{% if ansible_os_family != 'RedHat' %}
log-format '{"bytes_read":%B,"hostname":"%H","http":{"method":"%HM","uri":"%HP","query":"%HQ","version":"%HV"},"unique-id":"%ID","status_code":%ST,"gmt_date_time":"%T","timestamp":%Ts,"bytes_uploaded":%U,"backend_name":"%b","beconn":%bc,"backend_queue":%bq,"client_ip":"%ci","client_port":%cp,"frontend_name":"%f","frontend_ip":"%fi","frontend_port":%fp,"ssl":{"ciphers":"%sslc","version":"%sslv"},"request":{"headers":{"host":"%[capture.req.hdr(0),json(utf8ps)]","referer":"%[capture.req.hdr(1),json(utf8ps)]","ua":"%[capture.req.hdr(2),json(utf8ps)]","accept":"%[capture.req.hdr(3),json(utf8ps)]"}}}'
{% else %}
# XXX haproxy para CentOS es 1.x. esa versión no entiende
# HM, `http-request capture`, y otros. utilice una versión simplificada del
# registro JSON. el formato de registro de 1.x no entiende comillas simples.
# los espacios deben escaparse.
log-format {"bytes_read":%B,"hostname":"%H","unique-id":"%ID","status_code":%ST,"gmt_date_time":"%T","timestamp":%Ts,"bytes_uploaded":%U,"backend_name":"%b","beconn":%bc,"backend_queue":%bq,"client_ip":"%ci","client_port":%cp,"frontend_name":"%f","frontend_ip":"%fi","frontend_port":%fp,"ssl":{"ciphers":"%sslc","version":"%sslv"},"request":{"headers":"%hr"}}
{% endif %}
backend servers
option forwardfor
server server1 {{ project_backend_host }}:{{ project_backend_port }} maxconn 32 check
os_haproxy_flags:
FreeBSD: |
haproxy_config="{{ haproxy_conf_file }}"
#haproxy_flags="-q -f ${haproxy_config} -p ${pidfile}"
Debian: |
#CONFIG="/etc/haproxy/haproxy.cfg"
#EXTRAOPTS="-de -m 16"
OpenBSD: ""
RedHat: |
OPTIONS=""
haproxy_flags: "{{ os_haproxy_flags[ansible_os_family] }}"
# _____________________________________________fluentd
fluentd_system_config: |
log_level debug
suppress_config_dump
fluentd_configs:
input_udp_1514:
enabled: yes
config: |
<source>
@type syslog
@label @forward
port 1514
bind 127.0.0.1
tag syslog
# incluir la severidad en el evento syslog.
# por defecto, el complemento de entrada syslog no incluye severidad.
severity_key severity
<parse>
message_format rfc5424
with_priority true
</parse>
</source>
input_udp_5140:
enabled: true
config: |
<source>
@type syslog
@label @haproxy
port 5140
bind 127.0.0.1
tag haproxy
severity_key severity
<parse>
message_format rfc3164
</parse>
</source>
# procesar el registro de acceso desde haproxy. el nivel de información incluye los registros de acceso.
# la clave `message` incluye JSON escapado. como el JSON incluye todos los datos,
# descartar otros datos en el evento fluentd con `reserve_data false`.
<label @haproxy>
<filter *.*.info>
@type parser
<parse>
@type json
json_parser json
time_type string
time_key gmt_date_time
time_format %d/%b/%Y:%H:%M:%S %z
</parse>
key_name message
reserve_data false
replace_invalid_sequence true
</filter>
<match **>
@type relabel
@label @forward
</match>
</label>
outout_default:
enabled: yes
config: |
# enviar eventos a elasticsearch. tenga en cuenta que los eventos se envían con
# la API `_bulk`. puede tomar un tiempo enviar los eventos.
<label @forward>
<match **>
@type elasticsearch
# no use 127.0.0.1 aquí. use CN en el certificado
host localhost
port 9200
scheme https
ssl_version TLSv1_2
user "logstash"
password "logstash"
# XXX necesita crear un rol para enviar datos a un índice diferente a
# `logstash`, porque el rol de `logstash`, que es estático y se
# preinstala, solo tiene acceso a patrones de índice `logstash-*`.
# logstash_prefix syslog
# habilitar registro de depuración en el transportista. los eventos enviados a elasticsearch
# se registran en el archivo de registro. probablemente desee establecer esto en
# falso en producción.
with_transporter_log true
ca_file {{ opensearch_conf_dir }}/root-ca.pem
ssl_verify true
logstash_format true
# XXX una solución para usar opensearch con el complemento de salida elasticsearch. vea también fluentd_gems a continuación.
#
# https://github.com/uken/fluent-plugin-elasticsearch/issues/915
verify_es_version_at_startup false
default_elasticsearch_version 7
<buffer>
timekey 1d
timekey_use_utc true
timekey_wait 10m
</buffer>
</match>
</label>
fluentd_gems:
- name: elasticsearch-transport
version: 7.13.3
state: present
- name: elasticsearch-api
version: 7.13.3
state: present
- name: elasticsearch
version: 7.13.3
state: present
- name: fluent-plugin-elasticsearch
version: 5.1.0
state: present
os_fluentd_flags:
FreeBSD: |
fluentd_flags="-p {{ fluentd_plugin_dir }} --log {{ fluentd_log_file }}"
Debian: |
TD_AGENT_LOG_FILE="{{ fluentd_log_file }}"
TD_AGENT_OPTIONS="-p {{ fluentd_plugin_dir }}"
STOPTIMEOUT=180
RedHat: |
TD_AGENT_LOG_FILE="{{ fluentd_log_file }}"
TD_AGENT_OPTIONS=""
OpenBSD: "--daemon /var/run/fluentd/fluentd.pid --config {{ fluentd_config_file }} -p {{ fluentd_plugin_dir }} --log {{ fluentd_log_file }}"
fluentd_flags: "{{ os_fluentd_flags[ansible_os_family] }}"
# _____________________________________________apt
apt_repo_keys_to_add:
- https://packages.treasuredata.com/GPG-KEY-td-agent
apt_repo_to_add:
- "deb http://packages.treasuredata.com/4/ubuntu/{{ ansible_distribution_release }}/ {{ ansible_distribution_release }} contrib"
# _____________________________________________redhat_repo
redhat_repo:
treasuredata:
baseurl: http://packages.treasuredata.com/4/redhat/$releasever/$basearch
gpgkey: https://packages.treasuredata.com/GPG-KEY-td-agent
Licencia
Copyright (c) 2019 Tomoyuki Sakurai <[email protected]>
Se concede permiso para utilizar, copiar, modificar y distribuir este software para cualquier
propósito con o sin cargo, siempre que se incluya el aviso de copyright anterior y este aviso
de permiso en todas las copias.
EL SOFTWARE SE PROPORCIONA "TAL CUAL" Y EL AUTOR RENUNCIA A TODAS LAS GARANTÍAS
CON RESPECTO A ESTE SOFTWARE INCLUYENDO TODAS LAS GARANTÍAS IMPLÍCITAS DE
COMERCIABILIDAD Y ADECUACIÓN. EN NINGÚN CASO EL AUTOR SERÁ RESPONSABLE DE NINGÚN DAÑO ESPECIAL, DIRECTO, INDIRECTO O CONSECUENTE O CUALQUIER DAÑO
QUE SURJA DE LA PÉRDIDA DE USO, DATOS O BENEFICIOS, YA SEA EN UNA ACCIÓN DE CONTRATO, NEGLIGENCIA O CUALQUIER OTRA ACCIÓN TORTICERA, SURGIENDO DE O EN CONEXIÓN CON EL USO O DESEMPEÑO DE ESTE SOFTWARE.
Información del Autor
Tomoyuki Sakurai y@trombik.org
Este README fue creado por qansible.
ansible-galaxy install trombik.opensearch