Tienda Wifi

Tienda Wifi
CiudadWireless es la tienda Wifi recomendada por elhacker.NET

Entradas Mensuales

Síguenos en:

Canal Oficial Telegram de elhacker.NET Grupo Facebook elhacker.NET Twitter elhacker.NET Canal Youtube elhacker.NET Comunidad Steam: Grupo elhacker.NET Mastodon

Entradas populares

PostHeaderIcon Puppet: la navaja suiza para la automatización de los administradores de sistemas


Puppet es una herramienta que permite desplegar configuraciones, instalar paquetes en diferentes servidores a través de código. Es una herrramienta para realizar Infrastructure as a Code (IaaC) La diferencia de Puppet frente a otros como Ansible, es que puppet tiene instalado un agente en el equipo que se asegura de que la configuración indicada en el código de Puppet se mantiene. Si el código de puppet indica que la máquina tiene que tener el firewall encendido y un usuario lo deshabilita, el agente de Puppet volverá a activarlo cuando realice su check.


 



Infraestructura

  • Puppet Master
  • Puppet Agent
  • Comunicación entre los nodos


Puppet Master

Servidor donde se alojan los módulos y configuraciones que indicará a los clientes cual es el estado deseado por el administrador.

Módulos

Un módulo se compone de

  • Manifests
  • Templates
  • Ficheros

Manifest

Scripts en ruby con el código que realizará la gestión de la configuración. Existen módulos para diferentes tipos de software, por ejemplo:

  • Zabbix Server / Proxy / Agent / Agent 2
  • Firewalld
  • NTP

Son los encargados de realizar la instalación en caso de que se solicite en la configuración o template.

Template

Es la configuración que se desea para un software que se haya instalado, por ejemplo para poder indicar a Zabbix Agent cual es su servidor y servidor activo, para el NTP cual es su servidor desde donde sincronizarse, para el Firewalld cuales son las reglas que debe aplicar. Tambien poder indicarle el estado del servicio, si siempre ha de estar encendido.

También permite indicar la creación de usuarios, copiar las claves RSA que deben autorizar el login...

Ficheros

A diferencia de los templates, los ficheros simplemente son instrucciones de copiar uno o varios ficheros al cliente, de forma que siempre tenga el fichero disponible o instalado. Uno de los posibles usos es copiar certificados a la root trusted store para que el cliente pueda confiar en los equipos de la red interna.

Certificate Authority

La comunicación entre el servidor Puppet Master y los clientes se realiza mediante certificados SSL. El cliente enviará su CSR al servidor de Puppet Master y este lo podrá firmar para autorizar a la máquina a integrarse en la infraestructura y establecer una comunicación entre ellos de forma segura.


Puppet Agent

Compuesto por:

Agent

Servicio que se ha de instalar en el cliente para que pueda realizar la comunicación con el servidor para obtener nuevas configuraciones y comunicar el nivel de compliance (si cumple o no lo indicado en la configuración) en el que se encuentra la máquina.

Facter

Responsable de recolectar el estado en el que se encuentra el cliente para que el agente pueda comunicarlo al servidor. El servidor le indicará las tareas pendientes a realizar para cumplir al 100% con la configuración deseada.


Comunicación entre los nodos


  1. Agente: Envía un CSR al puppet master (posible cliente)
  2. Master: Firma el certificado y se lo envía al cliente (confirma como cliente al agente)
  3. Agente: Envía su estado al servidor
  4. Master: Compara con el fichero de configuración para ese agente y le indica las tareas que debe realizar.


Los pasos 3 y 4 se repiten regularmente para asegurar que el cliente mantiene la configuración que le ha indicado el servidor.


Instalación del servidor

Requisitos previos

La máquina debe tener acceso a internet en el proceso de instalación

Configuración del hostname

La instalación del servidor necesita que se configure correctamente el nombre del equipo.


hostnamectl set-hostname puppet-master

Añada el nombre de dominio en el fichero /etc/hosts con el FQDN.


echo "127.0.0.1 puppet-master.home.local puppet-master" >> /etc/hosts


Configuración de la IP

Ya sea a través de una reserva DHCP en el DHCP server o bien configurando de forma estática la IP en el servidor, asegúrese que la máquina tiene una IP estática.

Configuración del firewall

Si la máquina tiene instalado un Firewall local y/o tiene un Firewall perimetral/segmentación, asegurese de que permite el puerto 8140/tcp para la comunicación entre los agentes y el servidor.

Iptables



iptables -I INPUT -p tcp -m tcp --dport 8140 -j ACCEPT

service iptables save

UFW


ufw allow 8140


Firewalld


firewall-cmd --permanent --zone=public --add-port=8140/tcp



Reinicio

Finalmente reinicie el equipo para que tenga en cuenta le nuevo nombre de la máquina y sobre  todo para validar y comprobar que las configuraciones de la ip estática y el firewall se mantienen.


reboot



Instalación

Proceda con la instalación del Puppet Master

Instalación del servidor


wget https://apt.puppet.com/puppet-release-bullseye.deb

dpkg -i puppet-release-bullseye.deb

apt update

apt install -y puppetserver

source /etc/profile.d/puppet-agent.sh


Confirme la versión instalada


puppetserver -v



Edite el fichero de configuración de Puppet



nano /etc/default/puppetserver




y modifique la RAM máxima que va a consumir la Java Virtual Machine (JVM). Por defecto viene configurada con 2Gb, sin embargo para entornos pequeños puede usar 512Mb.

Cambie el valor de las variables

JAVA_ARGS="-Xms2g -Xmx2g"

al valor deseado



JAVA_ARGS="-Xms512m -Xmx512m"


Guarde los cambios. Configure el servidor


puppet config set server puppet.psc.local --section main

puppet config set runinterval 10m --section main

puppet config set environment production --section server

puppet config set dns_alt_names puppet,puppet.psc.local --section server


Finalmente active y inicie el servicio.



systemctl enable puppetserver

systemctl start puppetserver


El primer arranque de puppet tardará un poco, espere a que finalice sin errores.

A continuación ejecute el siguiente código. Esto aplicará a todos los nodos que tengan Puppet instalado. Modificará el fichero hosts añadiendo dichas lineas. Si dispone de un servidor DNS en el entorno, entonces no será necesario.

Cuidado si habilita el valor purge => true ya que eliminará cualquier cambio que se realice a mano en los ficheros hosts de las máquinas.


cat <<endblock >> /etc/puppetlabs/code/environments/production/manifests/site.pp 

node default {


  resources { 'host': purge => true }


  host { 'localhost':                 ip => '127.0.0.1', }

  host { 'puppet-master.psc.local':   ip => '192.168.0.3', host_aliases => [ 'puppet-master', 'puppet' ] }

  host { 'puppet-client.psc.local':   ip => '192.168.0.4', host_aliases => [ 'puppet-client'] }

}

endblock



Si en el propio servidor ejecuta


cat /etc/hosts


Posteriormente ejecuta

puppet agent -vt


Y vuelve a visualizar el fichero hosts



cat /etc/hosts


Podrá ver que el contenido es el siguiente


# HEADER: This file was autogenerated at 2022-11-01 17:23:13 +0100

# HEADER: by puppet.  While it can still be managed manually, it

# HEADER: is definitely not recommended.

# Your system has configured 'manage_etc_hosts' as True.

# As a result, if you wish for changes to this file to persist

# then you will need to either

# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl

# b.) change or remove the value of 'manage_etc_hosts' in

#     /etc/cloud/cloud.cfg or cloud-config from user-data

#

192.168.0.3     puppet-master.psc.local puppet-master puppet

127.0.0.1       localhost


# The following lines are desirable for IPv6 capable hosts

192.168.0.4     puppet-client.psc.local puppet-client

En el fichero sites.pp del entorno, también puede indicar que software o configuraciones van a tener los equipos de dicho entorno.


Configuración de entorno

Por defecto Puppet Server crea un entorno llamado production. Podemos crear tantos como nos interese, sin embargo proceda con la configuración de que viene por defecto para comprobar que la instalación es correcta.

Configuración de la jerarquía

En puppet se puede definir una jerarquia a la hora de aplicar los ficheros de configuración.

  1. La configuración del nodo en concreto
  2. La configuración de la familia de sistema operativo
  3. Paquetes comunes

Edite el fichero


nano /etc/puppetlabs/code/environments/production/hiera.yaml


y modifíquelo para tener el siguiente contenido. Se ha cambiado el trusted.certname por hostname y se ha añadido el osfamily. 


---

version: 5

defaults:

  # The default value for "datadir" is "data" under the same directory as the hiera.yaml

  # file (this file)

  # When specifying a datadir, make sure the directory exists.

  # See https://puppet.com/docs/puppet/latest/environments_about.html for further details on environments.

  datadir: data

  data_hash: yaml_data

hierarchy:

  - name: "Per-node data (yaml version)"

    path: "nodes/%{::trusted.certname}.yaml"

  - name: "Per-os data"

    path: "osfamily/%{::osfamily}"

  - name: "Other YAML hierarchy levels"

    paths:

      - "common.yaml"


Como posibles parámetros del node, existen los siguientes


::trusted.certname 


Usa el FQDN del equipo como nombre del fichero, recomendable si el mismo puppet gestiona equipos de diferentes dominios y puede colisionar el nombre. 


::hostname


Usa solo el hostname de la máquina, si solo va a gestionar los dominios de un equipo y no van a colisionar nunca. 


Common packages

En la carpeta del entorno, cree el fichero common_packages.pp

cd /etc/puppetlabs/code/environments/production/manifests/

nano common_packages.pp

Y añada el contenido deseado, por ejemplo puede añadir los siguientes paquetes que por lo general se suelen usar en los sistemas Linux.


class common_packages {


  package { 'net-tools':

    ensure => 'installed'

  }


  package { 'htop':

    ensure => 'installed'

  }


  package { 'fail2ban':

    ensure => 'installed'

  }


}

 

 Ahora cree el fichero de paquetes comunes para el environment.

cat <<endblock >> /etc/puppetlabs/code/environments/production/data/common.yaml

---


classes:

  - common_packages

endblock


echo "hiera_include('classes')" >>


Quedando de la siguiente manera


root@puppet-master:~# cat /etc/puppetlabs/code/environments/production/manifests/site.pp

node default {


  resources { 'host': purge => true }


  host { 'localhost':                 ip => '127.0.0.1', }

  host { 'puppet-master.psc.local':   ip => '192.168.0.3', host_aliases => [ 'puppet-master', 'puppet' ] }

  host { 'puppet-client.psc.local':   ip => '192.168.0.4', host_aliases => [ 'puppet-client'] }

}

hiera_include('classes')



Reincie el servidor puppet y realice la prueba


systemctl restart puppetserver 


Instalación del cliente

Requisitos previos

Configuración del hostname

Proceda a configurar el hostname en la máquina cliente, es indiferente el nombre que le ponga, pero ha de ser un nonmbre no usado en la red local

Cliente 1 que será un servidor Web Nginx

hostnamectl set-hostname nginx-01

Cliente 2 que será un servidor de MariaDB

hostnamectl set-hostname nginx-01

Cliente 3 que será un equipo de un usuario

hostnamect set-hostname laptop-guille

Configuración del fichero hosts

Si el servidor no tiene un registro DNS en el servidor DNS local o de la empresa, deberá añadir las siguientes lineas en el fichero /etc/hosts de la máquina cliente. Suponiendo que la IP del servidor es 192.168.0.10, su hostname es my-puppet-server y que el dominio local es home.local

echo "192.168.0.3 puppet-master puppet-master.psc.local" >> /etc/hosts

Compruebe que tiene conectividad

ping -c 4 puppet-master.psc.local


A continuación instale el Puppet Agent


wget https://apt.puppet.com/puppet-release-bullseye.deb

dpkg -i puppet-release-bullseye.deb

apt update

apt install -y puppet-agent

source /etc/profile.d/puppet-agent.sh 


Realice la configuración inicial ejecutando los siguiente comandos


 puppet config set runinterval 10m --section main

puppet config set server puppet-master.psc.local --section agent

puppet config set ca_server puppet-master.psc.local --section agent

puppet config set environment production --section agent


y podrá ver los cambios en el fichero /etc/puppetlabs/puppet/puppet.conf. A continuación active el servicio en el arranque e inicie el cliente


systemctl enable puppet

systemctl start puppet 


Finalmente genere la petición al servidor y espere a que sea aceptada por el servidor

puppet ssl bootstrap 


Gestión de los clientes

Cuando un nuevo nodo se quiere unir a la infraestructura de Puppet, este debe enviar una petición de enroll al servidor al puppet-master con el comando visto en el anterior post puppet ssl bootstrap.

Conéctese al servidor mediante ssh y compruebe si hay certificados pendientes de autorizar con

Listar clientes pendientes de autorizar

Los nuevos nodos que han enviado una petición al puppet-master

puppetserver ca list

 

Listar todos los clientes

Para ver todos los clientes ya sean autorizados o pendientes

puppetserver ca list --all


Autorizar un cliente nuevo

Supongamos que tenemos el cliente puppet-client.psc.local, para firmarlo debe ejecutar el comando

puppetserver ca sign --certname puppet-client.psc.local 


Autorizar un cliente nuevo

Supongamos que tenemos el cliente puppet-client.psc.local, para firmarlo debe ejecutar el comando 


puppetserver ca sign --certname puppet-client.psc.local


Eliminar un cliente actual

Si desea desautorizar un cliente o eliminarlo de la infraestructura de puppet para que no pueda comunicarse con el servidor, ejecute el siguiente comando. 


puppetserver ca clean --certname puppet-client.psc.local


Configuración del cliente con template

Ahora ya dispone de un cliente en el entorno (realmente dos si tiene en cuenta el propio servidor). Por lo que llega el momento de usar código para configurar las opciones que quiera que esten en la máquina cliente.

Volviendo a revisar el fichero /etc/puppetlabs/code/environments/production/hiera.yaml encuentra que el parámetro datadir contiene la ruta relativa a donde reside el fichero hiera.yaml. Tal y como indica, se encuentra a la misma altura.

cd /etc/puppetlabs/code/environments/production/data 


Y tal y como se ha indicado en el fichero hiera.yaml los ficheros de los nodos residiran en una carpeta interna llamada nodes. Por defecto no existe, por lo que hay que crearla. Lo mismo sucede para los templates de sistema operativo (osfamily).


mkdir -p /etc/puppetlabs/code/environments/production/data/{nodes,osfamily} 


Cree el fichero para el nodo llamado puppet-client con

nano /etc/puppetlabs/code/environments/production/data/nodes/puppet-client.psc.local.yaml 


Y añada el siguiente contenido de ejemplo, que instalará y configurará el agente Zabbix


---

classes:

  - zabbix_agent2


zabbix_agent2::zabbix_version: '6.2'

zabbix_agent2::repo_manage: true

zabbix_agent2::package_manage: true

zabbix_agent2::package_ensure: present

zabbix_agent2::package_name: ['zabbix-agent2']

zabbix_agent2::service_enable: true

zabbix_agent2::service_ensure: 'running'

zabbix_agent2::service_manage: true

zabbix_agent2::service_name: 'zabbix-agent2'

zabbix_agent2::service_provider: ~

zabbix_agent2::service_hasstatus: true

zabbix_agent2::service_hasrestart: true

zabbix_agent2::config:

  PidFile: '/run/zabbix/zabbix_agent2.pid'

  LogFile: '/var/log/zabbix/zabbix_agent2.log'

  LogFileSize: 0

  Server: '192.168.0.24'

  ServerActive: '192.168.0.24'

  Hostname: "%{::hostname}"

  Include: '/etc/zabbix/zabbix_agent2.d/*.conf'

  ControlSocket: '/tmp/agent.sock' 



Debe asegurarse de que tiene el módulo instalado en el servidor. Por defecto no viene, así que debe proceder a instalarlo.


puppet module install puppetlabs-apt

puppet module install puppetlabs-stdlib --version 6.6.0 --force

puppet module install gjerjens-zabbix_agent2 


A continuación, en el cliente, ejecute el comando de actualización de puppet


puppet agent -vt 


En el primer intento, puede que falle la instalación, ya que no habrá introducido el repositorio. Por lo que una vez vuelva a ejecutarlo se deberá instalar el paquete sin problemas.


Crear un nuevo entorno Puppet

Puede interesar tener varios entornos en el sistema Puppet por ejemplo porque quiere montar el entorno de production, staging, development... o quiere gestionar los equipos de diferentes empresas desde un mismo servidor.

Para ello tan solo debe copiar la carpeta de production y todas sus subcarpetas


cd /etc/puppetlabs/code/environments/

cp -r production development 


Elimine los ficheros contenidos en data/nodes ya que son nodos que pertenecen al otro environment.


 cd /etc/puppetlabs/code/environments/development/data/nodes

rm -f *.yaml


Edite el fichero common.yaml del environment para poner los paquetes y versiones que le interesen para la versión de development.

La instalación de un módulo por defecto se instala en el entorno production, para instalarlo en el nuevo environment, se debe indicar con el parámetro --environment xxxxxx.


puppet module install --environment development MODULE_TO_INSTALL



Módulos

  • Genéricos de sistema
  • Seguridad y bastionado
  • Monitorización
  • Elastic stack

Genéricos de sistema

Aquellos módulos que son para configurar básicos para realizar configuraciones del sistema operativo.


puppet module install puppetlabs-ntp

puppet module install saz-timezone

puppet module install puppetlabs-accounts


puppet module install puppetlabs-apt

puppet module install stm-debconf


puppet module install puppet-yum

puppet module install puppetlabs-yumrepo_core


puppet module install puppet-keepalived

puppet module install puppet-logrotate


puppet module install puppetlabs-concat

puppet module install puppetlabs-inifile


puppet module install puppetlabs-postgresql

puppet module install puppetlabs-stdlib

puppet module install puppetlabs-transition

puppet module install puppetlabs-translate


Seguridad y bastionado

Aquellos módulos que permiten configurar el bastionado del equipo

puppet module install saz-sudo

puppet module install puppet-trusted_ca

puppet module install puppet-firewalld 


Monitorización

Sensu

puppet module install sensu-sensu

 

Zabbix Agent 2

El módulo de Zabbix Agent 2 no oficial, necesita cumplir una dependencia de la librería stdlib, pero esta ha de ser superior a la 4.13.0 e inferior a la 7.0.0 ya que sino dará el siguiente error a la hora de instalarlo.

Para ello primero forzaremos la versión de la librería de stdlib a la 6.6.0

puppet module install puppetlabs-stdlib --version 6.6.0 --force


Y posteriormente instalaremos la versión del módulo de Zabbix Agent 2

puppet module install gjerjens-zabbix_agent2 


Template para nodo

---

classes:
  - zabbix_agent2

zabbix_agent2::zabbix_version: '6.2'
zabbix_agent2::repo_manage: true
zabbix_agent2::package_manage: true
zabbix_agent2::package_ensure: present
zabbix_agent2::package_name: ['zabbix-agent2']
zabbix_agent2::service_enable: true
zabbix_agent2::service_ensure: 'running'
zabbix_agent2::service_manage: true
zabbix_agent2::service_name: 'zabbix-agent2'
zabbix_agent2::service_provider: ~
zabbix_agent2::service_hasstatus: true
zabbix_agent2::service_hasrestart: true
zabbix_agent2::config:
  PidFile: '/run/zabbix/zabbix_agent2.pid'
  LogFile: '/var/log/zabbix/zabbix_agent2.log'
  LogFileSize: 0
  Server: '192.168.0.24'
  ServerActive: '192.168.0.24'
  Hostname: "%{::hostname}"
  Include: '/etc/zabbix/zabbix_agent2.d/*.conf'
  ControlSocket: '/tmp/agent.sock'

 

Elastic stack

Para instalar los módulos para Elastic y Kibana

puppet module install elastic-elastic_stack

puppet module install elastic-elasticsearch 

puppet module install elastic-kibana



Fuentes:
https://docs.driverlandia.com/books/puppet 



0 comentarios :

Publicar un comentario

Los comentarios pueden ser revisados en cualquier momento por los moderadores.

Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.

Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.