Cambio de usuario en procesos de NMIS / OMK (Debian)
Introducción
Actualmente, la máquina virtual de FirstWave ejecuta los procesos del sistema y las tareas programadas utilizando el usuario predefinido root, lo que garantiza el funcionamiento completo del ecosistema, pero mantiene un nivel de privilegio superior al recomendado para operación regular.
En la presente guía, se describen los pasos necesarios para realizar el cambio de usuario. Este ajuste permite que los procesos se ejecuten bajo el usuario correcto, asegurando una administración adecuada de permisos, mayor seguridad y un funcionamiento más controlado del entorno.
A continuación, se muestra el proceso que debe aplicarse en un sistema operativo Debian.
Proceso
Se accede vía consola con las credenciales correspondientes. Si se ejecuta un top, puede observarse que la mayoría de los procesos básicos del entorno se ejecutan con el usuario root.
Para iniciar con el proceso, se genera un script con el nombre deseado y extensión .sh; se asignan los permisos necesarios para que el script pueda ejecutarse correctamente. Se recomienda generarlo en la carpeta /home.
cd /home
nano usuario_nuevo.shEl archivo deberá de contener lo siguiente:
# Configuración de usuarios y grupos necesarios para OMK/NMIS
useradd -m -U omkadmin
usermod -a -G omkadmin nmis
usermod -a -G nmis omkadmin
# Si está utilizando Open-AudIT, también deberá agregar el usuario Apache (www-data) al grupo omkadmin.
#usermod -a -G www-data omkadmin
#usermod -a -G omkadmin www-data
# Detener todos los servicios que impactan o son impactados por OMK/NMIS
/usr/local/omk/bin/checkomkdaemons.sh stop
service nmis9d stop
systemctl stop cron.service
sleep 10
service nmis9d stop
# INICIO de cambios estándar del instalador
OMK_DIR=/usr/local/omk
# Establecer que la estructura de directorios de OMK sea escribible por el grupo
echo Set OMK directory structure writable by group:
sudo chown -R omkadmin:omkadmin "${OMK_DIR}";
sudo find "${OMK_DIR}" -type d -exec chmod 0770 '{}' \;;
# Establecer que usuarios y grupo puedan escribir archivos
echo Set user and group able to write files:
sudo find "${OMK_DIR}" -type f -exec chmod 0660 '{}' \;;
# Establecer scripts del directorio script como ejecutables para usuario y grupo
echo Set scripts executable by user and group:
sudo find "${OMK_DIR}/script" -type f -exec chmod 0770 '{}' \;;
# Establecer scripts del directorio bin como ejecutables para usuario y grupo
echo Set scripts executable by user and group:
sudo find "${OMK_DIR}/bin" -type f -exec chmod 0770 '{}' \;;
# FIN de cambios estándar del instalador
# Eliminar subdirectorios PAR existentes (pueden tener permisos incorrectos)
echo Delete existing PAR subdirectories as we may have set incorrect permissions on this directory
sudo rm -Rf ${PAR_GLOBAL_TMPDIR}/par-*
sudo rm -Rf /tmp/par-*
# Asignar sticky bit al directorio PAR_GLOBAL_TMPDIR y acceso exclusivo para root
echo Set sticky bit on $PAR_GLOBAL_TMPDIR directory and only executable by root.
sudo chmod 1700 ${PAR_GLOBAL_TMPDIR}
# Recrear directorios PAR usando root, nmis y omkadmin para inicializar permisos correctos
echo Recreate $PAR_GLOBAL_TMPDIR/par- directories for root,nmis and omkadmin
sudo ${OMK_DIR}/bin/patch_config.exe 2> /dev/null
sudo -u nmis ${OMK_DIR}/bin/patch_config.exe 2> /dev/null
sudo -u omkadmin ${OMK_DIR}/bin/patch_config.exe 2> /dev/null
# Actualizar archivo opCommon.json con nuevos directorios de PID
echo Update opCommon.json config with new PID directories
sed -i 's/var\/run/var\/run\/omk/g' /usr/local/omk/conf/opCommon.json
# Actualizar archivos de servicios systemd
echo Update SYSTEMCTL Server Files
echo omkd.service
# Configurar servicio para ejecutarse con usuario/grupo omkadmin y nuevo directorio run
sed -i 's/\[Service\]/\[Service\]\nUser\=omkadmin\nGroup\=omkadmin/g' /etc/systemd/system/omkd.service
sed -i 's/\/var\/run/\/var\/run\/omk/g' /etc/systemd/system/omkd.service
sed -i 's/\[Service\]/\[Service\]\nPermissionsStartOnly\=true\nExecStartPre\=\/bin\/sh \-c \"mkdir \-p \/var\/run\/omk\/\"\nExecStartPre\=\/bin\/sh \-c \"chown omkadmin\.omkadmin \/var\/run\/omk\/\"\nExecStartPre\=\/bin\/sh \-c \"chmod 3700 \/var\/run\/omk\/\"/g' /etc/systemd/system/omkd.service
echo opchartsd.service
# Aplicar mismos ajustes de usuario, grupo y directorio run
sed -i 's/\[Service\]/\[Service\]\nUser\=omkadmin\nGroup\=omkadmin/g' /etc/systemd/system/opchartsd.service
sed -i 's/\/var\/run/\/var\/run\/omk/g' /etc/systemd/system/opchartsd.service
sed -i 's/\[Service\]/\[Service\]\nPermissionsStartOnly\=true\nExecStartPre\=\/bin\/sh \-c \"mkdir \-p \/var\/run\/omk\/\"\nExecStartPre\=\/bin\/sh \-c \"chown omkadmin\.omkadmin \/var\/run\/omk\/\"\nExecStartPre\=\/bin\/sh \-c \"chmod 3700 \/var\/run\/omk\/\"/g' /etc/systemd/system/opchartsd.service
echo opconfigd.service
# Aplicar mismos ajustes de usuario, grupo y directorio run
sed -i 's/\[Service\]/\[Service\]\nUser\=omkadmin\nGroup\=omkadmin/g' /etc/systemd/system/opconfigd.service
sed -i 's/\/var\/run/\/var\/run\/omk/g' /etc/systemd/system/opconfigd.service
sed -i 's/\[Service\]/\[Service\]\nPermissionsStartOnly\=true\nExecStartPre\=\/bin\/sh \-c \"mkdir \-p \/var\/run\/omk\/\"\nExecStartPre\=\/bin\/sh \-c \"chown omkadmin\.omkadmin \/var\/run\/omk\/\"\nExecStartPre\=\/bin\/sh \-c \"chmod 3700 \/var\/run\/omk\/\"/g' /etc/systemd/system/opconfigd.service
echo opeventsd.service
# Aplicar mismos ajustes de usuario, grupo y directorio run
sed -i 's/\[Service\]/\[Service\]\nUser\=omkadmin\nGroup\=omkadmin/g' /etc/systemd/system/opeventsd.service
sed -i 's/\/var\/run/\/var\/run\/omk/g' /etc/systemd/system/opeventsd.service
sed -i 's/\[Service\]/\[Service\]\nPermissionsStartOnly\=true\nExecStartPre\=\/bin\/sh \-c \"mkdir \-p \/var\/run\/omk\/\"\nExecStartPre\=\/bin\/sh \-c \"chown omkadmin\.omkadmin \/var\/run\/omk\/\"\nExecStartPre\=\/bin\/sh \-c \"chmod 3700 \/var\/run\/omk\/\"/g' /etc/systemd/system/opeventsd.service
# Ajustar servicio nmis9d para que se ejecute con usuario/grupo nmis
echo nmis9d.service
sudo sed -i '/\[Service\]/a User=nmis\nGroup=nmis' /etc/systemd/system/nmis9d.service
# Actualizar configuración de logrotate para usar omkadmin
echo Update logrotate config
sed -i 's/create 0660 nmis nmis/create 0660 omkadmin omkadmin/g' /etc/logrotate.d/omk-rotate.conf
sed -i 's/endscript/endscript\n\tsu omkadmin omkadmin/g' /etc/logrotate.d/omk-rotate.conf
# Actualizar propietarios de tareas programadas (cron) de OMK/NMIS
echo Update all crontab job owners
sed -i 's/root/ omkadmin\t/g' /etc/cron.d/opaddress
sed -i 's/root/ omkadmin\t/g' /etc/cron.d/opconfig
sed -i 's/root/ omkadmin\t/g' /etc/cron.d/opevents
sed -i 's/root/ omkadmin\t/g' /etc/cron.d/oplicense
sed -i 's/root/ omkadmin\t/g' /etc/cron.d/opreports
sed -i 's/root/ nmis\t/g' /etc/cron.d/nmis9
# Agregar verificación horaria de permisos al CRONTAB
echo Add an Hourly Rights Check to CRONTAB
touch /etc/cron.d/omk_check_omkadmin_user_group
echo "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" >> /etc/cron.d/omk_check_omkadmin_user_group
echo "# m h dom mon dow user command" >> /etc/cron.d/omk_check_omkadmin_user_group
# Revisar archivos que no pertenecen a grupos esperados
echo "40 * * * * root find /usr/local/omk ! -group omkadmin ! -group nmis ! -regex '/usr/local/omk/var/lib/common/par-.+' -exec ls -lAhd '{}' \;;" >> /etc/cron.d/omk_check_omkadmin_user_group
# Revisar archivos no escribibles por omkadmin
echo "42 * * * * omkadmin find /usr/local/omk ! -writable -exec ls -lAhd '{}' \;;" >> /etc/cron.d/omk_check_omkadmin_user_group
# Revisar archivos con bit setgid activo
echo "44 * * * * root find /usr/local/omk -perm /+2000 -exec ls -lAhd '{}' \;;" >> /etc/cron.d/omk_check_omkadmin_user_group
# Revisar archivos con bit setuid activo
echo "46 * * * * root find /usr/local/omk -perm /+4000 -exec ls -lAhd '{}' \;;" >> /etc/cron.d/omk_check_omkadmin_user_groupSe le dan permisos de ejecución al archivo:
chmod +x usuario_nuevo.shSe ejecuta el script:
bash usuario_nuevo.shSe mostrará algo similar a lo siguiente si la ejecución del script es correcta:
useradd: user 'omkadmin' already exists
job complete!
Set OMK directory structure writable by group:
Set user and group able to write files:
Set scripts executable by user and group:
Set scripts executable by user and group:
Delete existing PAR subdirectories as we may have set incorrect permissions on this directory
Set sticky bit on /usr/local/omk/var/lib/common/ directory and only executable by root.
Recreate /usr/local/omk/var/lib/common//par- directories for root,nmis and omkadmin
Update opCommon.json config with new PID directories
Update SYSTEMCTL Server Files
omkd.service
opchartsd.service
opconfigd.service
opeventsd.service
nmis9d.service
Update logrotate config
Update all crontab job owners
Add an Hourly Rights Check to CRONTABEn este punto, se realizan validaciones para identificar posibles inconsistencias relacionadas con los archivos que el script modifica.
a) Validación de cron de opReports:
more /etc/cron.d/opreportsLa salida se mostrará de la siguiente manera. Valide con el siguiente texto de configuración para asegurarse de que la gestión del archivo se realizó correctamente. De lo contrario, edite el archivo y ajústelo como corresponda.
# this cron schedule runs the opReports scheduler every 5 minutes
#
# m h dom month dow user command
*/5 * * * * omkadmin export PAR_GLOBAL_TMPDIR=/usr/local/omk/var/lib/common/||:; /usr/local/omk/bin/opreports-schedu
ler.exe
*/1 * * * * omkadmin export PAR_GLOBAL_TMPDIR=/usr/local/omk/var/lib/common/||:; /usr/local/omk/bin/opreports-genera
te-one-offsb) Validación de cron de NMIS:
more /etc/cron.d/nmis9La salida se mostrará de la siguiente manera. Valide con el siguiente texto de configuración para asegurarse de que la gestión del archivo se realizó correctamente. De lo contrario, edite el archivo y ajústelo como corresponda.
# NMIS9 Cron Configuration
# if you DON'T want any NMIS cron mails to go to nmis ,
# uncomment and adjust the next line
# MAILTO=WhoeverYouAre@yourdomain.tld
# some tools like fping reside outside the minimal path
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# note that almost all operations are now performed by the nmisd
# m h dom month dow user command
# create reports, Daily Monthly Weekly
9 0 * * * nmis export $(/usr/bin/xargs < /etc/environment)||:; /usr/local/nmis9/bin/nmis-cli act=run-reports period=day type=all
9 1 * * 0 nmis export $(/usr/bin/xargs < /etc/environment)||:; /usr/local/nmis9/bin/nmis-cli act=run-reports period=week type=all
9 2 1 * * nmis export $(/usr/bin/xargs < /etc/environment)||:; /usr/local/nmis9/bin/nmis-cli act=run-reports period=month type=all
# performance data
*/5 * * * * nmis export $(/usr/bin/xargs < /etc/environment)||:; /usr/local/nmis9/bin/nmis-cli act=collect-top-data > /dev/null
0 * * * * nmis export $(/usr/bin/xargs < /etc/environment)||:; /usr/local/nmis9/bin/nmis-cli act=collect-performance-data > /dev/null
# Monitor daemon
*/5 * * * * nmis export $(/usr/bin/xargs < /etc/environment)||:; /usr/local/nmis9/admin/check_daemons.pl act=check-daemons start=1 quiet=1 ver
bose=1c) Validación de archivo de rotación de logs:
more /etc/logrotate.d/omk-rotate.confLa salida se mostrará de la siguiente manera. Valide con el siguiente texto de configuración para asegurarse de que la gestión del archivo se realizó correctamente. De lo contrario, edite el archivo y ajústelo como corresponda.
# logrotate configuration file
# the Opmantek Daemon needs to be reloaded to reopen the log files
# if opEvents is installed (and new enough to hold logs open),
# then the opeventsd also needs to be reloaded; ditto opconfigd
# if opFlow is installed, then the oflowd also needs to be reloaded
/usr/local/omk/log/*.log
{
rotate 15
daily
maxsize 250M
dateext
dateformat -%Y-%m-%d.%s
compress
delaycompress
create 0660 omkadmin omkadmin
missingok
notifempty
sharedscripts
postrotate
{ [ -e /etc/systemd/system/omkd.service ] && systemctl restart omkd >/dev/null; } || { { [ -x /etc/init.d/omkd ] &&
service omkd reload >/dev/null; } || true; }
{ [ -e /etc/systemd/system/opeventsd.service ] && systemctl restart opeventsd >/dev/null; } || { { [ -x /etc/init.d
/opeventsd ] && grep -Fq reload /etc/init.d/opeventsd && service opeventsd reload >/dev/null; } || true; }
{ [ -e /etc/systemd/system/opflowd.service ] && systemctl restart opflowd >/dev/null; } || { { [ -x /etc/init.d/opf
lowd ] && grep -Fq reload /etc/init.d/opflowd && service opflowd reload >/dev/null; } || true; }
{ [ -e /etc/systemd/system/opconfigd.service ] && systemctl restart opconfigd >/dev/null; } || { { [ -x /etc/init.d
/opconfigd ] && grep -Fq reload /etc/init.d/opconfigd && service opconfigd reload >/dev/null; } || true; }
{ [ -e /etc/systemd/system/opchartsd.service ] && systemctl restart opchartsd >/dev/null; } || { { [ -x /etc/init.d
/opchartsd ] && grep -Fq reload /etc/init.d/opchartsd && service opchartsd reload >/dev/null; } || true; }
{ [ -e /etc/systemd/system/ophad.service ] && systemctl restart ophad >/dev/null; } || { { [ -x /etc/init.d/ophad ]
&& grep -Fq reload /etc/init.d/ophad && service ophad reload >/dev/null; } || true; }
endscript
su omkadmin omkadmin
}
/usr/local/omk/log/snow_api.log
{
rotate 10
daily
maxsize 250M
compress
delaycompress
missingok
notifempty
}d) Validación del archivo de inicio del demonio de NMIS:
more /etc/systemd/system/nmis9d.serviceLa salida se mostrará de la siguiente manera. Valide con el siguiente texto de configuración para asegurarse de que la gestión del archivo se realizó correctamente. De lo contrario, edite el archivo y ajústelo como corresponda.
# simple systemd unit file for the nmis9 daemon
[Unit]
Description=FirstWave NMIS9 Daemon
After=network-online.target
After=mongod.service
Requires=mongod.service
Wants=mongod.service
Wants=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
User=nmis
Group=nmis
Type=forking
Restart=no
EnvironmentFile=-/etc/environment
PIDFile=/usr/local/nmis9/var/nmis_system/nmisd.pid
TimeoutSec=90s
KillMode=process
ExecStart=/usr/local/nmis9/bin/nmisde) Validación del archivo de inicio del demonio de opCharts:
more /etc/systemd/system/opchartsd.serviceLa salida se mostrará de la siguiente manera. Valide con el siguiente texto de configuración para asegurarse de que la gestión del archivo se realizó correctamente. De lo contrario, edite el archivo y ajústelo como corresponda.
root@omk-vm9-debian11:/home# more /etc/systemd/system/opchartsd.service
# simple systemd unit file for the Opmantek opCharts daemon
[Unit]
Description=FirstWave opCharts daemon
After=network-online.target
After=mongod.service
Requires=mongod.service
Wants=mongod.service
Wants=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
PermissionsStartOnly=true
ExecStartPre=/bin/sh -c "mkdir -p /var/run/omk/"
ExecStartPre=/bin/sh -c "chown omkadmin.omkadmin /var/run/omk/"
ExecStartPre=/bin/sh -c "chmod 3700 /var/run/omk/"
User=omkadmin
Group=omkadmin
Type=forking
Restart=no
EnvironmentFile=/etc/environment
PIDFile=/var/run/omk/opchartsd.pid
TimeoutSec=120s
KillMode=control-group
ExecStart=/usr/local/omk/bin/opchartsd.pl
root@omk-vm9-debian11:/home#f) Validación del archivo de inicio del demonio de OMK:
more /etc/systemd/system/omkd.serviceLa salida se mostrará de la siguiente manera. Valide con el siguiente texto de configuración para asegurarse de que la gestión del archivo se realizó correctamente. De lo contrario, edite el archivo y ajústelo como corresponda.
# simple systemd unit file for the Opmantek Webserver daemon
[Unit]
Description=FirstWave Webserver
After=network-online.target
After=mongod.service
Requires=mongod.service
Wants=mongod.service
Wants=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
PermissionsStartOnly=true
ExecStartPre=/bin/sh -c "mkdir -p /var/run/omk/"
ExecStartPre=/bin/sh -c "chown omkadmin.omkadmin /var/run/omk/"
ExecStartPre=/bin/sh -c "chmod 3700 /var/run/omk/"
User=omkadmin
Group=omkadmin
Type=forking
Restart=no
EnvironmentFile=/etc/environment
PIDFile=/var/run/omk/opmantek.exe.pid
TimeoutSec=120s
KillMode=control-group
ExecStart=/usr/local/omk/script/opmantek.pl -f -p /var/run/omk/opmantek.exe.pid -rg) Validación de los parámetros de pid de los demonios en el archivo opCommon.json
more /usr/local/omk/conf/opCommon.json | grep pidLa salida se mostrará de la siguiente manera. Valide con el siguiente texto de configuración para asegurarse de que la gestión del archivo se realizó correctamente. De lo contrario, edite el archivo y ajústelo como corresponda.
"opconfigd_pid" : "/var/run/omk/opconfigd.pid",
"opeventsd_pid" : "/var/run/omk/opeventsd.pid",
"opflowd_pid" : "/var/run/omk/opflowd.pid",
"opchartsd_pid" : "/var/run/omk/opchartsd.pid",Se recargan los demonios y se reinician:
systemctl daemon-reload
systemctl restart nmis9d
systemctl restart omkd
systemctl restart opchartsd Es importante darle un reinicio a la máquina virtual:
rebootAl iniciar nuevamente la máquina virtual, se sugiere ejecutar un top para visualizar el usuario omkadmin que se ha configurado para la ejecución de los diferentes procesos del sistema.
Para concluir, se puede validar que los módulos se muestren de forma correcta vía UI.