domingo, 14 de abril de 2019

Servicios y Demonios


Un demonio es un procesos que corre en el background para realizar un servicios. Generalmente se lanzan desde el inicio del sistema y continuan corriendo hasta que alguien mas los detiene manualmente.

Un servicio normalmente se refiere a uno o mas demonios que pueden ser iniciados, o detenidos al mismo tiempo.

El proceso con ID 1 es systemd. Anteriormente era initd.

El comando systemctl se usa para administrar distintos tipos de objetos de tipo systemd llamados unidades. Para listar estos tipos de unidades podemos ejecutar systemctl -t

Algunos tipos de unidades son:

Servicios: Servicios de sistemas
Sockets: Listeners o network sockets
Paths: Usados para retrasar la activación de un servicio hasta que un cambio en el equipo ocurra.

Para listar las unidades de un tipo en específico ejecutamos:

systemctl ist-units --type=service
systemctl list-unit-files --type=service

Para conocer el status de un servicio

systemctl status name.type <-Status
ps -up PID <-Status
systemctl is-active name.type <- Está activo
systemctl is-enabled name.type <- Está habilitado

Estados:
loaded
active (runnng)
active (exited)
inactive
enabled: El servicio iniciará en automátio al booteo
disabled: El servicio no iniciará en autmático al booteo
static:

Iniciar, Detener y Reiniciar Servicios

systemctl start service.type
systemctl stop service.type
syscmctp restart service.type

Para conocer las dependencias de un servicio podemos ejecutar

systemctl list-dependencies service

Para habilitar o deshabilitar un servicio para que inicie en autmático al booteo

systemctl enable service.type
systemctl disable service.type

Procesos y Jobs


Procesos

Un proceso es una instancia de un ejecutable o programa que se encuentra corriendo.

Estados de un procesos

R = Runnning
S = Un proceso que está esperando a que se cumpla alguna condición
D = Proceso Ininterrumpible
K = Idéntico al interior, es ininterrumpible pero si puede ser “matado”
T = Stopped
Z = Proceso Zombie

El comando que utilizamos para saber el status de un procesos es el comando ps lo podemos utilizar con alguna de las siguientes opciones:

aux
lax
-ef

Por ejemplo con un ps -ef podemos ver procesos ejecutándose, quien los está ejecutando, su ID de proceso, si tiene salida a una terminal o en pantalla (tty, pts) o se están ejecutando en background (?), el tiempo que lleva ejecutándose y el comando que ejecuta (entre [ ] algunos que  de kernel)




Jobs

Los jobs nos permiten desde una instancia de shell correr y administrar multiples comandos al mismo tiempo. Solamente un job a la vez puede estar conectado con la terminal que controla la entrada del teclado y salida al monitor. Cuando un job no está corriendo conectado con la terminal que está controlando se le conoce como corriendo en background.

Si queremos ejecutar un proceso en background lo hacemos agregano al final el símbolo &

En el siguiente ejemplo podemos ver algunos procesos enviados a ejecutarse en background, vemos como se genera su PID y que los podemos ver en ejecución con un ps -ef. De igual forma como podemos listar los jobs ejecutándose con el comando jobs así como el jobID de cada uno de ellos



Si queremos traer a la terminal en control (foreground) un proceso ejecutandose en el background lo podemos hacer con el comando fg y el JobID(%jobID). Ejemplo fg %1 .Si queremos suspender ese job que tenemos ahora en la terminal podemos ejecutar ctrl+Z o, en su caso, ctrl+C para matarlo

Al igual que con fg traemos a foreground un procesos podemos también enviar a background con el comando bg (%jobID). Si el job estaba detenido comenzará a ejecutarse nuevamente

Si ejecutamos el comando ps j podemos ver los procesos, el job que los está ejecutando así como el status del job


Control de procesos

Se tiene las siguientes señales para controlar procesos:

1 – HUP – Se usa para reportar la terminación de un proceso o para reiniciarlizarlo
2 – INT – Termina un programa (ctrl+C)
3 – QUIT – Parecido a INT pero genera un dump del proceso (ctrl + \)
9 – KILL – Mata a un proceso
15 – TERM – Para terminar un proceso, a diferencia de KILL no lo forza, se lo pide
18 – CONT – Para continuar la ejecución de un proceso
19 – STOP – Terminar o suspende la ejecución de un proceso de forma forzada.
20 – TSTP – Pide terminar o suspender la ejecutción ( ctrl + Z)

El comando utilizado para enviar estas señales es el comando kill con la siguiente sintaxis:
kill -signal PID

Si queremos terminar varios procesos que cumplan un criterio, por ejemplo el nombre, podemos utilizar el comando killall con la siguiente sintaxis:
killall -signal -u username command_pattern

El comando pkill nos permite hacer lo mismo que killall pero con criterios de búsqueda mas avanzados como el UID, GID, Parent, Terminal y lo utilizamos con la siguiente sintaxis:
pkill -signal -G GID command_pattern

Con el comando pstree podemos ver todo el arbol de proceso de un sistema o un usuario

Ejemplo:

Queremos saber los procesos que está ejecutando un usuario:
pgrep -l -u javier

Podemos validar que el usuario está logueado en el sistema comando w -f, el cual nos indica también el TTY o PTS donde está logueado el usuario

Para matar todos los procesos de ese usuario ejecutamos:
pkill -15 -u javier

Para matar los procesos que está ejecutando en determinada terminal:
pkill -15 -t pts/1


Permisos en archivos - Parte 02


Permisos Especiales


En linux, existen algunos permisos especiales que podemos establecer sobre los archivos o carpetas. Veamos algunos de ellos


Setuid y Setgid – Nos sirven para poder ejecutar un comando como el usuario o el grupo dueño del archivo y no como el usuario que ejecuta el comando . Esto se logra modificando un bit en los permisos de las archivos mediante la aplicación de alguno de los siguientes permisos mediante el método simbólico:
u+s (suid)
[javier@localhost ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27880 ago 4 2017 /usr/bin/passwd
g+s (sgid)


Como se puede observar en el resultado de listar los permisos del archivo passwd vemos una letra ‘s’ en lugar del permiso de ejecución. Esto nos dice que tenemos habilitado el setuid
El comando g+s puede aplicarse también a directorios para que los archivos creados en éstos directorios hereden los permisos de grupo del directorio en lugar de los permisos de grupo del usuario que los crea.
Siticky bit: Se aplica solo a directorios para que solamente el owner de los archivos en el directorio y root puedan eliminar esos archivos.
o+t (sticky)
javier@localhost ~]$ ls -ld /tmp/
drwxrwxrwt. 16 root root 380 abr 14 11:53 /tmp/


Se había mencionado que con el método númerico mediante tres bits podíamos establecer los permisos de un archivo. Por ejemplo un chmod 777 nos da permisos de lectura, escritura y ejecución a usuario, grupo y otros
Existe un cuarto bit que se antepone a los otros 3 y nos permite establecer mediante el método númerico los permisos especiales setuid, setgid y sticky tomando en cuenta lo siguiente:


setuid = 4
setgid = 2
sticky = 1


Esto quiere dejecir que también podríamos ejecutar un chmod de la siguiente forma:
chmod 2770 dir1 <- Tenemos permisos de r,w,x para el owner, r,w,x para el grutpo, sin permisos para otros y establecimos el setgid al dejar en 2 el primer bit.
Cuando creamos un archivo, estos archivos se crean con ciertos permisos por default. Por ejemplo:

javier@localhost ~]$ touch test.txt
[javier@localhost ~]$ ll test.txt
-rw-rw-r--. 1 javier javier 0 abr 14 12:24 test.txt

Como podemos ver, en el ejemplo anterior, por default se generaron permisos 664 a este archivo. Si quisieramos que cada que creemos un archivo durante una sesión los permisos default para estos nuevos archivos fueran distintos podemos utilizar el comando umask
Si validamos el valor que tenemos por default en umask seguramente nos encontraremos algo como:

[javier@localhost ~]$ umask
0002

Primero debemos entender que por default no se dan permisos de ejecución a ningún archivo creado solo permisos de lecutra o de escritura. Lo que el 2 significa en el 4to bit (el de otros) es que tampoco daremos permisos de escritura (2) a “otros” cuando creamos un archivo. Es decir umask nos sirve para negar por default ciertos permisos
Como se comentó, los cambios que realicemos con umask solamente aplicarán durante la sesión en turno. Cuando hagamos logout se volverá a los permisos default.

Ejemplo:
umask 007 <- Los archivos creados no tendrán permisos de r,w para otros

Una consideración a tomar en cuenta es que al contrario de los archivos los directorios siempre se crean con permisos de ejecución para usuario, grupo y otros para que podamos ejecutar el comando cd sobre ellos.
Si quisieramos modificar de forma permantente los permisos default de los archivos recién creados lo tendremos que hacer modificando el archivo /etc/bashrc y /etc/profile



jueves, 24 de enero de 2019

Permisos en Archivos - Parte01

Los permisos para archivos y carpetas en Linux se establecen en grupos de tres :

  • owner: La persona a cargo de un archivo (normalmente el que crea el archivo)
  • group: El grupo de usuarios que usan un archivo con un propósito
  • other: Cualquier persona que no tiene permisos exlícitos en un archivo





Los tipos de permisos en archivos y directorios son:

  • Lectura (r): Con este permiso puedes leer archivos, o listar los archivos de un directorio
  • Escritura (w): Puedes crear, modificar o eliminar archivos en un directorio
  • Ejecución (x): Para ejecutar archivos como comandos

Por ejemplo si tenemos los siguientes permisos sobre un archivo llamado file01:

- rwx rw- r-- student student file01

  • El dueño del archivo es el usuario student y el grupo dueño es el grupo student
  • El usuario student tiene permisos de lectura, escritura y ejecución
  • Los miembros del grupo student tienen permisos de lectura y escritura
  • El resto de los usuarios que no pertenecen al grupo student solamente pueden leer

Es importante considerar que los permisos en Linux no se heredan, hay que establecerlos especificamente a cada archivo o subdirectorio.

Para cambiar los permisos en archivos usamos el comando chmod. Podemos usar dos tipos de métodos para cambiar permisos

Simbólico:

  • Quien: u, g, o, a (usuario, grupo, otros, todos)
  • Qué: +, -, = (agregar, remover, establecer igual)
  • Cual: r, w, x (lectura, escritura, ejecución)

Numérico:

Es representado por tres octetos donde cada octeto puede ser un número entre 0 y 7:

  • r=4
  • w=2
  • x=1

Ejemplos:

chmod go +w file01 <- Estamos agregando permisos de escritura al grupo y a otros al archivo file01
chmod 750 file01 <- Estamos agregando permisos de rwx al owner, rx al grupo y ningún permiso a otros

En el comando chmod podemos usar la opción -R para aplicar permisos de forma recursiva a un directorio

chmod -R g+rwx dir01

Con el comando chown podemos cambiar al usuario o grupo dueño de un archivo

chown -R student dir02 <- Cambiamos de dueño al directorio dir02 y a todos los archivos y directorios dentro para que sea el usuario student
chown :group02 dir01 <- Cambiamos al grupo dueño del directorio dir01 para que sea el group02
chown student02:gruoup01 dir01 <-Cambiamos al usuario dueño del directorio dir01 para que sea student02 y al grupo dueño para que sea group01






miércoles, 16 de enero de 2019

Administrando Usuarios y Grupos - Parte 02

Continuemos viendo algunos otros comandos para administrar usuarios y grupos..

Con el comando useradd [nombre_usuario] podemos crear usuarios nuevos. Al crear un usuario nuevo los campos del archivo /etc/passwd se crean con los valores default.
Algunos de estos valores default están definidos en el archivo /etc/login.defs

Con el comando usermod podemos modificar usuarios existentes, para ellos tenemos las siguientes opciones:


-c, --comment: Para agregar valores como el nombre completo al campo GECOS
-g, --gid: Para especificar el grupo primario del usuario
-G, --groups: Para especificar una lista de grupos secundarios
-a, --append: Se usa con la opción -G para agregar grupos secundarios a la lista sin eliminar los existentes
-d, --home: Para especificar un nuevo directorio home para el usuario
-m, --move: Para mover el directorio home a una nueva ubicación. Debe usarse con la opción -d
-s, --shell: Para especificar una nueva shell de login para el usuario
-L, --lock: Para bloquear al usuario
-U, --unlock: Para desbloquear al usuario

Ejemplo:

usermod -aG wheel student

Con el comando userdel [nombre_usuario] podemos eliminar usuarios del archivo /etc/passwd
Con userdel -r también eliminamos los elementos del directorio home del usuario

Para cambiar el password de un usuario utilizamos el comando passwd [nombre_usuario]
Los passwords para usuarios deben seguir ciertas reglas, al menos 8 caracteres, que no sean palabra de diccionario, el nombre del usuario o passwords anteriores

Como dato adicional, existen UID de usuario reservados y son los siguientes:
  • 0: root
  • 1-200: usuarios de sistema
  • 201-999: usuarios de sistema para procesos de sistema que no son dueños de archivos en el filesystem
En el caso de los passwords, éstos están alojados en un archivo diferente a /etc/passwd, los passwords se alojan en /etc/shadow más no en texto plano sino con un hash.

Al igual que passwd, shadow tiene campos separados por símbolos ":" y son los siguientes:
  1. Login Name: Debe ser una cuenta del sistema
  2. Password Encriptado: Es el passwords divididos en tres partes por signos de "$":
    •  La primera parte: Es el algoritmo utilizado para el hash. Si tenemos un 1 por ejemplo sería MD5. El 6 es un SHA-152
    •  Entre el segundo y el tercero símbolo de "$": Encontramos el "salt" que es una variable aleatoria utilizada para generar el hash
    •  En la tercer parte: Encontramos finalmente el hash encriptado
  3. Fecha para cambio del password
  4. Mínimo número de días anets de que el password tenga que ser cambiado
  5. Máximo número de días antes de que el password deba ser cambiado
  6. Periodo en días para alertar que el password va a expirar
  7. Número de días que una cuenta permanece activa después de que el password expiró
  8. La fecha de expiración de una cuenta
  9. Campo que no se usa actualmente (tal vez en un futuro)
Es posible cambiar éstos parámetros utilizando el comando chage para implementar una política de password con las siguientes opciones:

-l: Para listar los parámetros que tiene configurados el usuario
-d: Fecha de expiración (con un cero forzaría a cambiar el password en el siguiente login)
-m: Mínimo de días antes de que el password sea cambiado
-M: Máximo de días antes de que el password sea cambiado
-W: Días para el warning o alertamiento
-I: Días para marcar al usuario como inactivo al expirar
-E: Fecha de expiración de una cuenta

Ejemplos:
  • chage -l student
  • chage -d 0 student
  • chage -E 2019-02-11 student
Hay ocasiones en que creamos un usuario pero no queremos que tenga la opción de loguearse al shell, por ejemplo tal vez solo sea un usuario de correo.
En esos casos podemos crear el usuario y con el comando usermod indicar que no tendrá acceso al shell de ésta forma:
usermod -s /sbin/nologin student
  

lunes, 14 de enero de 2019

Administrando Usuarios y Grupos - Parte 01

En Linux un usuario puede ser dueño de archivos, para ver que usuario es dueño de un archivo podemos ejecutar: ls -l 

Los programas o procesos también corren o se ejecutan con usuarios, lo podemos ver con un: ps au

Con el comando id podemos ver la información del usuario con el que estamos logueados

Para conocer los usuarios de nuestro sistema Linux podemos hacerlo desde el archivo /etc/passwd

En éste archivo veremos listados los usuarios por renglón, y separados con “:” otros campos en el siguiente orden:

1. Nombre de usuario
2. Password el cual aparece con una X para no tenerlo visible
3. UID o Identificador del usuario
4. GID o Identificador del grupo al que pertenece el usuario
5. GECOS o Descripción del usuario
6. Directorio home del usuario
7. El programa que corre cuando el usuario se loguea




En cuanto a los grupos, existen dos tipos:

Grupos primarios: Es el grupo que aparece listado en /etc/passwd para el usuario y es el grupo que también es dueño de los archivos creados por un usuario. Normalmente el grupo primario de un usuario es un grupo que se crea al crear el usuario y tiene el mismo nombre que éste.
Grupos secundarios: Un usuario puede pertenecer a varios grupos y esto es posible gracias a los grupos secundarios. Asi como tenemos el archivo /etc/passwd para los usuarios, también tenemos /etc/group para los grupos. Desde éste archivo podemos ver los UID que pertenecen a cada grupo.



Para cambiarnos de usuario con todo y el ambiente de ese usuario utilizamos el comando:
su – [nombre del usuario]
Si queremos únicamente hacer algo como otro usuario pero sin dejar nuestro ambiente actual usamos el comando:
su [nombre del usuario]
Si queremos salir del ambiente de un usuario al que nos cambiamos, utilizamos el comando exit

Para cambiar de usuario necesitamos conocer la contraseña del otro usuario, excepto si somos el usuario super administrador. El usuario super administrador de un sistema Linux es el usuario root.

Es posible dar permisos a usuarios para correr comandos como si fueran el usuario root. Esto lo podemos configurar desde el archivo /etc/sudoers

Para correr un comando configurado para ejecutarlo como root anteponemos sudo
Ejemplo: sudo usermod -d /home/exampleusernew exampleuser

Existe un grupo especial llamado wheel. Los usuarios de éste grupo pueden usar sudo para correr comandos como cualquier usuario incluyendo root. Es decir estamos dando permisos a un usuario de ejecutar cualquier comando como root anteponiendo un sudo

lunes, 7 de enero de 2019

Redireccionando salida a archivos o programas



El primero punto a considerar es conocer que en Linux existen canales de entrada y de salida. Tenemos por ejemplo entrada del teclado, salida de un comando a pantalla, a un archivo, salida de errores en pantalla o a un archivo.







Estos canales son los siguientes:

  • Canal 0: Standard input (stdin)
  • Canal 1: Standard output (stdout)
  • Canal 2: Standard Error (stderr)

Con los canales anteriores podemos generar distintos tipos de salida con distinta sintaxis. Tenemos:

  • comando > archivo : Salida a un archivo nuevo
  • comando >> archivo : Salida agregando a un archivo existente
  • comando 2> archivo : Enviar los mensajes de error a un archivo
  • comando 2> /dev/null : Descartar los mensajes de error
  • comando &> archivo : Salida & Errores a un archivo nuevo
  • comando &>> arhivo : Salida & Errores agregando a un archivo existente

Piping: O entubar, es el conectar procesos/programas entre sí. Es decir podemos enviar la salida de un comando (stdout) como entrada (stdin) de un segundo comando. Ejemplo:

ls | wc Cuenta el número de lineas, letras y caracteres del listado de archivos de una ubicación

Tee: Conocido también como tuberia T es la acción de enviar la salida de un comando (stdout) a un archivo o terminal (stdout) antes de enviarlo como entrada (stdin) a otro proceso. Ejemplo:

ls | tee /tmp/archivo.tmp | less Envia el listado de archivos de una ubicación a un archivo en tmp y después muestra este listado en pantalla

Si tee es utilizado al final de una tuberia se puede salvar el archivo y al mismo tiempo mostrarlo en pantalla. Ejemplo: ls | head -n 5 | tee /tmp/myfile.tmp

Servicios y Demonios

Un demonio es un procesos que corre en el background para realizar un servicios. Generalmente se lanzan desde el inicio de...