Documentos de Académico
Documentos de Profesional
Documentos de Cultura
install
nfs --server=192.168.0.254 --dir=/var/ftp/pub
key --skip
lang en_US.UTF-8
keyboard us
xconfig --startxonboot --resolution 1024x768 --depth 16
network --device eth0 --bootproto dhcp
rootpw --iscrypted $1$XxTOgHLX$Ag.XKutFr/mTxeUI/WvHU1
firewall --disabled
authconfig --useshadow --enablemd5
selinux --enforcing
timezone --utc Europe/Madrid
[...]
En el fichero kickstart se pueden poner comandos que queremos que se ejecuten antes de la
instalación (sección %pre) o después de la misma (sección %post). Ejemplos:
[...]
%include /tmp/mis_paquetes
%pre
echo firefox > /tmp/mis_paquetes <<< genero un paquete para instalar
%post
useradd amaya
[...]
Además, se puede cambiar el intérprete de comandos que se desee usar (bash, sh, perl, etc).
Los repositorios están en /etc/yum.repos.d/ con la extensión .repo. Un fichero .repo típico
tiene las siguientes opciones típicas:
[rhel-debuginfo]
name=Red Hat Enterprise Linux $releasever - $basearch - Debug
baseurl=ftp://ftp.redhat.com/pub/redhat/linux/enterprise/$releasever/en/os/$basearch/
Debuginfo/
enabled=1 <<< Habilitar o deshabilitar un repositorio
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
Para crear un repositorio, hay que usar la herramienta createrepo, que se encarga de crear el
índice para que yum pueda hacer las distintas operaciones.
RPM es una base de datos que lleva un control sobre todos los RPMs instalados en el sistema
* rpm -i <<< Instala un paquete si no está instalado
* rpm -F <<< Actualiza un paquete sólo si está instalado
* rpm -U <<< Actualiza un paquete aunque no esté instalado
* rpm -e <<< Borra un paquete ya instalado
* rpm -ivh --replacepgks <<< Sirve para poder reinstalar un paquete ya instalado, útil
para paquetes dañados
* rpm -ivh --oldpackage <<< Para poder bajar de versión
* rpm -ivh --replacefile <<< Para instalar todos los archivos, en caso de conflictos
* rpm -ivh --nodeps <<< Para poder instalar evitando las dependencias
* rpm -qa patron <<< Para hacer queries sobre los paquetes intalados siguiendo un patrón
* rpm -qp fichero_rpm <<< Hace la query sobre un paquete dado que aún no está
instalado, es muy útil para saber qué contiene el fichero
* rpm -qf fichero <<< Para saber de qué paquete viene el fichero especificado
* rpm -qi paquete <<< Para hacer una búsqueda en su descripción
* rpm -q --docfiles paquete <<< Para hacer búsquedas sólo de los ficheros de
documentación de un paquete dado
* rpm -q --configfiles paquete <<< Para hacer búsquedas sólo de los ficheros de
configuración de un paquete dado
* rpm -ql paquete <<< Para saber qué ficheros contiene el paquete especificado
* rpm -V paquete <<< Sirve para comparar lo que dice la BBDD y el paquete que de verdad
está instalado, es útil para saber si se nos ha reemplazado nuestro paquete por algún otro
malintencionado.
Las opciones vh son para poder ver algo más de información sobre el progreso de instalación
del paquete.
La base de datos esta en /var/lib/rpm, se debe incluir este directorio en el backup, si este
directorio está corrupto no podremos instalar/borrar/actualizar nunca más paquetes.
Los paquetes del kernel siempre se han de instalar con -i, puesto que de otra manera (usando
-F o -U), reemplazará el kernel existente y borrandolo, con lo cual si hay algún problema con el
kernel nuevo, la máquina no arrancará.
Ejercicios:
1. ¿Qué ficheros tiene el paquete initscripts?
[root@server2 Server]# rpm -qpl initscripts-8.45.30-2.el5.i386.rpm
/bin/doexec
/bin/ipcalc
/bin/usleep
/etc/X11/prefdm
/etc/adjtime
/etc/initlog.conf
[...]
2. ¿En qué host se empaquetó el RPM 'bash' y cuál es su tamaño de instalación?
[root@server2 Server]# rpm -qi bash
Name : bash Relocations: (not relocatable)
Version : 3.2 Vendor: Red Hat, Inc.
Release : 24.el5 Build Date: Tue 21 Oct 2008 02:15:55 PM
CEST
Install Date: Fri 17 Sep 2010 02:16:25 PM CEST Build Host: hs20-bc1-
7.build.redhat.com
Group : System Environment/Shells Source RPM: bash-3.2-24.el5.src.rpm
Size : 5349546 License: GPLv2+
Signature : DSA/SHA1, Mon 08 Dec 2008 01:25:44 PM CET, Key ID 5326810137017186
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
URL : http://www.gnu.org/software/bash
Summary : The GNU Bourne Again shell (bash) version 3.1.
Description :
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification. This
package (bash) contains bash version 3.1, which improves POSIX
compliance over previous versions.
Sin embargo, si la seguridad de nuestra máquina está comprometida, cualquiera puede ver
lo que escribo en él, por tanto, para evitar enviar la contraseña, ssh permite autenticar con
parejas de claves en vez de con contraseña.
[root@server2 Server]# ssh-keygen -t dsa -b 1024
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
0b:8f:5b:c7:f9:a6:a7:61:6f:a3:13:2f:88:d9:95:45 root@server2.example.com
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
Sin embargo, el tener acceso de root en una máquina tiene como inconvenientes que cuando
se hace algo indebido, no se puede auditar, por tanto es mejor limitar el acceso de root a las
máquinas y escalar privilegios o bien utilizar sudo, limitando los privilegios.
## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhap using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias FILESERVERS = fs1, fs2
# Host_Alias MAILSERVERS = smtp, smtp2
## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem
## Command Aliases
## These are groups of related commands...
[...]
Para configurar el demonio del syslog, hay que tocar el fichero /etc/sysconfig/syslog. Por
ejemplo para que syslog escuche mensajes remotos hay que poner esta línea:
SYSLOGD_OPTIONS="-m 0 -r"
El formato del fichero cron (ha de editarse con crontab -e) es:
minuto hora dia_mes mes dia_semana comando
Hay que tener cuidado, pues si se ponen los parámetros DIA_MES y DIA_SEMANA, lo que hace
cron es ejecutar de manera que se cumplan cualquiera de estas dos condiciones, en vez de las
dos.
Anacron se encarga de ejecutar las tareas que no se han podido ejecutar a la hora prevista por
cron. Las tareas de cron no se recuperan, sin emabargo, las tareas del sistema sí, anacron lo
hace mediante el arranque del sistema.
Se puede hacer con la herramienta gráfica system-config-printer, mediante la web cups (http:/
/localhost:631) o en la linea de comandos con lpadmin.
El directorio de spool para cups esta en /var/spool/cups y los ficheros de configuración /etc/
cups/cupsd.conf y /etc/cups/printers.conf.
Se puede hacer con la herramienta gráfica system-config-date o bien con la línea de comandos
ntp. El fichero de configuración es /etc/ntp.conf
Ejercicios
1. Crear, habilitar y poner como impresora por defecto una impresora solo texto local:
[root@server2 ~]# lpadmin -p server2-lp -v "lpd://localhost/dummy" -m textonly.ppd
[root@server2 ~]# lpadmin -p server2-lp -E
[root@server2 ~]# lpadmin -d server2-lp
[root@server2 ~]# lpr fichero_imprimier
BIOS
GRUB
KERNEL + INITRD
MONTAR / (RO)
INIT (LEE INITTAB)
SYSINIT (RC)
MONTAR FS
REMONTAR / (RW)
RC5.D
RC.LOCAL
TTYS
X
4.1.- GRUB
Tiene 2 etapas:
1st stage: es un pequeño programa que se añade a la MBR durante la instalación.
Simplemente se encagarga de cargar la segunda etapa del GRUB. El comando /sbin/grub-
install se usa para repararlo.
2nd stage: Se carga desde el FS que contiene a /boot. Carga el kernel en memoria. Se
configura en /boot/grub/grub.conf.
El entorno de rescate es un LiveCD que viene con RHEL y se arranca desde el prompt de
GRUB escribiendo "linux rescue". Este entorno de rescate provee un mínimo conjunto de
herramientas y que monta nuestro FS bajo /mnt/sysimage.
Si he tenido que arrancar la máquina en modo rescate y tengo que reinstalar un paquete que
está corrupto, la manera de hacerlo es:
# rpm --root /mnt/sysimage -qf /bin/ls
coreutils-5.97-23.el5
# rpm --root /mnt/sysimage --replacepkgs -ivh /path/to/coreutils-5.97-23.el5.rpm
Problemas típicos en el arranque tienen que ver con el FS, para lo que se usan los siguientes
comandos:
# fsck /
# mount -o remount,rw /
Todos los módulos disponibles para cada versión del kernel se encuentran bajo /lib/modules.
[root@station2 ~]# ls /lib/modules/
2.6.18-164.el5 2.6.18-164.el5xen
Para modificar las opciones del kernel, se usa el comando sysctl, sin embargo, para que el
cambio sea persistente, se debe editar el fichero /etc/sysctl.conf. Dichos parámetros son
los mismos que los ficheros que se encuentran bajo /proc, por tanto, para añadirlos a /etc/
sysctl.conf hay que quitar el /proc y reemplazar los '/' por '.'
[root@station2 ~]# cat /proc/sys/vm/swappiness
60
[root@station2 ~]# sysctl -w vm.swappiness=45
vm.swappiness = 45
[root@station2 ~]# cat /proc/sys/vm/swappiness
45
Para que el fichero se relea y por tanto, el cambio sea efectivo hay que ejecutar "sysctl -p"
Todas estas utilidades, obtienen su información leyendo del pseudo sistema de ficheros /proc
5.2.- Hardware
Todos los dispositivos hardware están mapeados a ficheros en /dev, sin embargo este
directorio es volátil, representa los dispositivos que el kernel tiene cargados (lo que está en
RAM).
Para poder reconocer dispositivos, existe udev, que es quien se encarga de crear el mapeo al
fichero que se almacena en /dev. udev puede ser configurado con reglas:
initrd debe ser re-creado cuando hay cambios en el sistema de ficheros, en el hardware o en
el kernel. Se especifica manualmente la version del kernel.
El 90% de los problemas de arranque en Linux tienen que ver con el initrd.
De manera general, podemos buscar información sobre un comando cuando el man no nos
ayuda:
[root@station2 rules.d]# man ifup
No manual entry for ifup
[root@station2 rules.d]# which ifup
/sbin/ifup
[root@station2 rules.d]# rpm -qf /sbin/ifup
initscripts-8.45.30-2.el5
[root@station2 rules.d]# rpm -qd initscripts-8.45.30-2.el5
/usr/share/doc/initscripts-8.45.30/ChangeLog
/usr/share/doc/initscripts-8.45.30/changes.ipv6
/usr/share/doc/initscripts-8.45.30/ipv6-6to4.howto
/usr/share/doc/initscripts-8.45.30/ipv6-tunnel.howto
/usr/share/doc/initscripts-8.45.30/static-routes-ipv6
/usr/share/doc/initscripts-8.45.30/sysconfig.txt
/usr/share/doc/initscripts-8.45.30/sysvinitfiles
/usr/share/man/man1/consoletype.1.gz
/usr/share/man/man1/doexec.1.gz
/usr/share/man/man1/genhostid.1.gz
/usr/share/man/man1/getkey.1.gz
/usr/share/man/man1/initlog.1.gz
/usr/share/man/man1/ipcalc.1.gz
/usr/share/man/man1/netreport.1.gz
/usr/share/man/man1/usleep.1.gz
/usr/share/man/man5/crypttab.5.gz
/usr/share/man/man8/fstab-decode.8.gz
/usr/share/man/man8/ppp-watch.8.gz
/usr/share/man/man8/service.8.gz
/usr/share/man/man8/sys-unconfig.8.gz
/usr/share/man/man8/usernetctl.8.gz
[root@station2 ~]# more /usr/share/doc/initscripts-8.45.30/sysconfig.txt
Files in /etc/sysconfig
/etc/sysconfig/authconfig
Sin embargo, para que el cambio sea persistente, hay que añadirlo al fichero de ruta del
interfaz concreto:
[root@station2 ~]# cat /etc/sysconfig/network-scripts/route-eth0
10.1.0.0/24 via 192.168.0.254
Ejercicios
1.- Evitar que la máquina responda a ping:
[root@server2 ~]# echo “net.ipv4.icmp_echo_ignore_all = 1” >> /etc/sysctl.conf
[root@server2 ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.ip_forward = 0
[student@station2 ~]$ ping server2
PING server2.example.com (192.168.0.102) 56(84) bytes of data.
8 0 78150744 sda
8 1 104391 sda1
8 2 18434587 sda2
8 3 522112 sda3
253 0 8388608 dm-0
253 1 491520 dm-1
253 2 5242880 dm-2
253 3 2097152 dm-3
También se puede consultar a blkid, es útil para identificar particiones cuando lo tenemos
montado todo con etiquetas:
[root@station2 ~]# blkid
/dev/mapper/vol0-home: UUID="87789b94-1396-480d-a200-e43eef723825" TYPE="ext3"
/dev/mapper/vol0-root: UUID="fde1b3e3-b4a7-487e-9ced-4c73a5b46614" TYPE="ext3"
/dev/sda3: LABEL="SWAP-sda3" TYPE="swap"
/dev/sda1: LABEL="/boot1" UUID="60d546e1-2624-4506-9a25-56b38a00376e" TYPE="ext3"
SEC_TYPE="ext2"
/dev/vol0/root: UUID="fde1b3e3-b4a7-487e-9ced-4c73a5b46614" TYPE="ext3"
Siempre, después de crear una particion con fdisk, hay que teclear partprobe para que el
kernel relea la tabla de particiones, sino no funcionará hasta el siguiente reinicio.
El comando tune2fs sirve tanto para cambiar como var ver opciones del FS:
[root@station2 ~]# tune2fs -l /dev/sda1
tune2fs 1.39 (29-May-2006)
Filesystem volume name: /boot1
Last mounted on: <not available>
Filesystem UUID: 60d546e1-2624-4506-9a25-56b38a00376e
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype
needs_recovery sparse_super
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 26104
Block count: 104388
Reserved block count: 5219
Free blocks: 72893
Free inodes: 26060
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 256
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 2008
Inode blocks per group: 251
Filesystem created: Fri Sep 17 14:05:57 2010
Last mount time: Tue Sep 21 11:19:32 2010
Last write time: Tue Sep 21 11:19:32 2010
Mount count: 18
Maximum mount count: -1
Last checked: Fri Sep 17 14:05:57 2010
Check interval: 0 (<none>)
Sin embargo, una vez creado el FS no se puede cambiar el tamaño de bloque, es necesario
recrear el FS otra vez.
La swap es un área de memoria en disco que la RAM puede usar en caso de necesidad.
Para crear una nueva particion swap hay que seguir los siguientes pasos:
[root@station2 ~]# cat /proc/partitions o fdisk -l
[root@station2 ~]# fdisk /dev/sda (p,n,t=82,w)
[root@station2 ~]# partprobe
[root@station2 ~]# mkfswap /dev/sdaX
[root@station2 ~]# vi /etc/fstab
[root@station2 ~]# swapon -a
[root@station2 ~]# mount -a
6.2.- RAID
Para ver información sobre el array se puede consultar /proc/mdstat o también usar mdadm:
[root@station2 ~]# mdadm --detail /dev/md0
[root@station2 ~]# mdmonitor
Y una vez que esté parado y desensamblado, se puede reconstruir de la siguiente manera:
[root@station2 ~]# mdadm --examine --scan >> /etc/mdadm.conf
[root@station2 ~]# mdadm --assemble --scan
La idea es poder añadir espacio en caliente a las particiones añadiendo discos reales.
Primero se ha de crear un volúmen físico (PV) en el que estén los discos físicos y luego un
grupo de volumenes (VG). Ambos son contenedores. dentro del VG se crean los volumenes
lógicos, que es la estructura lógica con la que trabajaremos como si fuera una partición.
Redimensionar un volumen:
● Agrandarlo:
[root@station2 ~]# lvextend -s +100M /dev/vg1/research
[root@station2 ~]# resize2fs -p /dev/vg1/research
● Encogerlo:
[root@station2 ~]# umount /dev/vg1/research
[root@station2 ~]# e2fsck /dev/vg1/research
[root@station2 ~]# resize2fs -p /dev/vg1/research 200M
[root@station2 ~]# lvreduce -L 200M /dev/vg1/research
Para reducirlo, sin parar, hay que quitar el disco físico del grupo:
[root@station2 ~]# pmvove /dev/sda10
[root@station2 ~]# vgreduce vg1 /dev/sda10
Removed “/dev/sda10” from volume group “vg1”
Ejercicios
WARNING: Re-reading the partition table failed with error 16: Device or resource
busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@server2 ~]# fdisk -l
UUID : bf52a9f6:f38d94b4:e546de2c:767da1fe
Events : 0.2
UUID : bf52a9f6:f38d94b4:e546de2c:767da1fe
Events : 0.4
UUID : bf52a9f6:f38d94b4:e546de2c:767da1fe
Events : 0.6
5.- Crear volumenes lógicos. Designar el RAID como volumen físico y crear un volumen
llamado volgroup y uno lógico llamado data
[root@server2 ~]# pvcreate /dev/md0
Physical volume "/dev/md0" successfully created
[root@server2 ~]# vgcreate volgroup /dev/md0
Volume group "volgroup" successfully created
[root@server2 ~]# vgdisplay
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size 3.47 GB
PE Size 32.00 MB
Total PE 111
Alloc PE / Size 99 / 3.09 GB
Free PE / Size 12 / 384.00 MB
VG UUID cPp86b-N7w2-G1eo-iYBp-2fdZ-FhOc-yPkqBq
--- Volume group ---
[root@server2 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2.3G 1.6G 585M 74% /
/dev/mapper/VolGroup00-LogVol02
248M 11M 226M 5% /home
/dev/xvda1 99M 28M 67M 30% /boot
tmpfs 193M 0 193M 0% /dev/shm
/dev/xvda3 130M 5.6M 117M 5% /opt/newapp
Los valores por defecto para los datos de caducidad se encuentran en /etc/login.defs, que
aplica a los usuarios creados a partir de la modificación.
Con umask podemos cambiar la forma en que se crear los ficheros / directorios por defecto.
Los grupos privados dificultan el intercambio de archivos entre usuarios, para lo que se suele
crear un directorio colaborativo. Para ello se usan SUID, SGID, STICKY.
U G O
SUID SGID STICKY RWX RWX RWX
1 1 1 111 111 111
Poniendo SGID sobre un directorio, conseguimos crear un directorio propiedad del grupo, por
tanto cada uno de los ficheros en él creados serán del grupo. Sin embargo, cualquier usuario
Sin embargo, para tener un control más fino sobre permisos a grupos y directorios, hay que
usar las ACLS.
Primero hay que comprobar que nuestro FS está montado con soporte de acls:
La última línea quita la entrada para student sobre f.txt de la ACL, no es quitar un permiso, es
eliminarlo del ACL.
Hay que tener en cuenta que con este comando no damos ni quitamos permisos sobre el
directorio, sino sobre los ficheros en él creados.
Con las quotas podemos tanto controlar el espacio en bloques (se mide en Kb) como el
espacio en número de inodos (ficheros). Estos cuotas tiene 2 límites el soft (se le da un aviso) y
el hard (se produce un error y no se permite continuar).
Una vez más, hay que verificar que el FS está preparado para quotas:
[root@station2 ~]# cat /etc/fstab
/dev/vol0/root / ext3 defaults
1 1
/dev/vol0/home /home ext3
defaults,acl,usrquota,grpquota 1 2
Luego, hay que habilitar las quotas (ésto sólo hay que hacerlo la primera vez):
[root@station2 ~]# mount -o remount,rw /home
Y finalmente, asignar las quotas deseadas (se puede hacer de varias maneras):
[root@station2 ~]# edquota username
Disk quotas for student (uid 500)
Filesystem blocks soft hard inodes soft hard
/dev/sda5 0 0 0 0 5 10
Así, el usuario student no puede crear más de 10 ficheros, avisándole cuando ha creado 5.
También podemos usar el comando setquota, que es mucho mejor si lo que queremos es
realizar un script donde se puedan automatizar las quotas.
[root@station2 ~]# setquota username 4096 5120 40 50 /foo
Y además, se puede usar un usuario con cuotas ya existente como plantilla para crear otro:
[root@station2 ~]# edquota -p user1 user2
Ejercicios.
2.- Modificar la política para que las passwords de todos los usuarios creados desde
ahora expiren cada 30 días.
[root@server2 ~]# cat /etc/login.defs
# PASS_MAX_DAYS Maximum number of days a password may be used.
PASS_MAX_DAYS 30
3.- Hacer que se pida cambio de contraseña para los usuarios cuando entren en el
sistema.
[root@server2 ~]# for USER in joshua alex dax bryan zak ed ; do chage -d 2010-08-21 $USER ; done
OJO: Poner un mes menos, pues queremos que la cambie siguiendo la política de 30 días
después.
[student@station2 ~]$ ssh -l alex server2
alex@server2's password:
You are required to change your password immediately (password aged)
Last login: Wed Sep 22 10:09:15 2010 from station2.example.com
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user alex.
Changing password for alex
4.- Añadir grupos al sistema, añadir a joshua y alex a sales, a dax y bryan a hr y a zak y
edd a web. Student debe estar en todos los grupos.
[root@server2 ~]# groupadd -g 201 sales
[root@server2 ~]# groupadd -g 202 hr
[root@server2 ~]# groupadd -g 203 web
[root@server2 ~]# usermod -G sales joshua
[root@server2 ~]# usermod -G sales alex
[root@server2 ~]# usermod -G hr dax
[root@server2 ~]# usermod -G hr bryan
[root@server2 ~]# usermod -G web zak
[root@server2 ~]# usermod -G web ed
[root@server2 ~]# usermod -aG sales -aG hr -aG web student
5.- Comprobar que cada usuario pertenece a cada uno de los grupos secundarios.
[root@server2 ~]# for USER in joshua alex dax bryan zak ed ; do id $USER ; done
uid=501(joshua) gid=501(joshua) groups=501(joshua),201(sales)
context=root:system_r:unconfined_t:SystemLow-SystemHigh
uid=502(alex) gid=502(alex) groups=502(alex),201(sales)
context=root:system_r:unconfined_t:SystemLow-SystemHigh
uid=503(dax) gid=503(dax) groups=503(dax),202(hr),203(web)
context=root:system_r:unconfined_t:SystemLow-SystemHigh
uid=504(bryan) gid=504(bryan) groups=504(bryan),202(hr)
context=root:system_r:unconfined_t:SystemLow-SystemHigh
uid=505(zak) gid=505(zak) groups=505(zak),203(web)
context=root:system_r:unconfined_t:SystemLow-SystemHigh
uid=506(ed) gid=506(ed) groups=506(ed),203(web)
context=root:system_r:unconfined_t:SystemLow-SystemHigh
6.- Crear el directorio /depts y los subdirectorios sales, hr y web, siendo el grupo
correspondiente el propietario de cada uno. Los ficheros creados en cada subdirectorio
han de pertenecer al grupo.
[root@server2 depts]# for DIR in sales hr web ; do mkdir $DIR ; done
[root@server2 depts]# for DIR in sales hr web ; do chgrp $DIR $DIR ; done
[root@server2 depts]# ls -ld *
drwxr-xr-x 2 root hr 4096 Sep 22 10:22 hr
drwxr-xr-x 2 root sales 4096 Sep 22 10:22 sales
drwxr-xr-x 2 root web 4096 Sep 22 10:22 web
[root@server2 depts]# for DIR in sales hr web ; do chmod g+s $DIR ; done
[root@server2 depts]# ls -ldh *
drwxrws--- 2 root hr 4.0K Sep 22 10:22 hr
drwxrws--- 2 root sales 4.0K Sep 22 10:22 sales
drwxrws--- 2 root web 4.0K Sep 22 10:22 web
[student@server2 sales]$ touch f.txt
[student@server2 sales]$ ls -l
total 12
7.- Trabajar con ACLs. Crear usuarios y directorios cumpliendo: Como fred, asegurar
que barney no podrá leer el fichero secretstuff, pero betty podrá leer y escribir; como
barney, y luego como betty intentar leer el fichero.
[root@server2 depts]# groupadd bedrock
[root@server2 depts]# groupadd wbuffalo
[root@server2 depts]# for USER in fred barney wilma betty ; do useradd $USER ; done
[root@server2 /]# for USER in fred barney wilma betty ; do usermod -aG bedrock $USER
; done
[root@server2 /]# for USER in fred barney ; do usermod -aG wbuffalo $USER ; done
[root@server2 depts]# mkdir -p /shared/lodge
[root@server2 /]# chgrp wbuffalo /shared/lodge/
[root@server2 depts]# chmod 2775 /shared/lodge
[fred@server2 lodge]$ touch secretstuff
[fred@server2 lodge]$ setfacl -m u:barney:- secretstuff
[fred@server2 lodge]$ setfacl -m u:betty:rw secretstuff
[fred@server2 lodge]$ getfacl secretstuff
# file: secretstuff
# owner: fred
# group: wbuffalo
user::rw-
user:barney:---
user:betty:rw-
group::rw-
mask::rw-
other::r--
[barney@server2 ~]$ cat /shared/lodge/secretstuff
cat: /shared/lodge/secretstuff: Permission denied
[betty@server2 ~]$ cat /shared/lodge/secretstuff
skdf sldkfh sdlkjf
sdj lsk372 ñsla
8.- Establecer cuotas en /home, haciendo que zak tenga un límite soft de 512 bloques de
1k y uno hard de 1024 bloques de 1k
[root@server2 /]# cat /etc/fstab
/dev/VolGroup00/LogVol02 /home ext3 defaults,usrquota 1 2
[root@server2 /]# mount -o remount,rw /home
[root@server2 /]# quotacheck -cugm /home
[root@server2 /]# quotaon /home
[root@server2 /]# edquota zak
Disk quotas for user zak (uid 505):
Filesystem blocks soft hard inodes soft hard
/dev/mapper/VolGroup00-LogVol02 14 512 1024 7 0
0
[zak@server2 ~]$ dd if=/dev/zero of=bigfile bs=1k count=800
dm-1: warning, user block quota exceeded.
800+0 records in
800+0 records out
819200 bytes (819 kB) copied, 0.006009 seconds, 136 MB/s
NIS almacena en unas tablas locales la información de usuarios, así cuando un cliente quiera
validar, obtiene toda la tabla NIS del servidor y posteriomente valida. Esto es muy inseguro,
pues todo va en claro.
El cliente necesita tener el paquete ypbind instalado. Para configurarlo, usamos la
herramienta gráfica system-config-authentication (o la herramienta de texto authconfig). Con
getent podemos ver la configuración actual sobre un item (obtenida del servidor NIS):
[root@server2 /]# getent passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[...]
Se exportan via NFS desde un servidor centralizado, y para montarlos bajo demanda, usamos
autofs. Autofs usa varios mapas, el principal es /etc/auto.master. Para crear un nuevo montaje
para /home/guest:
[root@server2 /]# cat /etc/auto.master
/home/guest /etc/auto.guests
[root@server2 /]# cat /etc/auto.guests
cd -fstype=iso9660,ro,nosuid,nodev:/dev/cdrom
Ésta es la configuración del cliente, el servidor simplemente ha de tener un export NFS normal
(o cualquier otro tipo de exportación de ficheros, como SAMBA):
[root@server2 /]# cat /etc/exports
* (rw,soft,intr)
Ejercicios:
Un certificado digital es una clave pública firmada por una autorizad en quien confiamos.
También existen los certificados autofirmados, no sirven nada más que para establecer una
comunicación cifrada. En ciertas ocasiones necesitaremos un certificado digital o bien los
pares de claves.
9.1.- OpenSSH
9.2- SELinux
Es una herramienta de control de acceso discrecional, el usuario puede decidir qué tipo de
permisos puedo poner sobre cada fichero individual e independiente de los permisos de
grupos/usuarios, ni siquiera root puede saltarse la seguridad de SELinux.
Cualquier cosa que la politica no diga explícitamente está prohibida, independientemente del
proceso o del propietario que intenté acceder. Las políticas no se pueden modificar.
La política más simple es target. Los procesos de usuarios no tienen restricción, pero los de
sistema sí:
[student@server2 sales]$ ps -Z
user_u:system_r:unconfined_t 6291 pts/1 00:00:00 bash
user_u:system_r:unconfined_t 7451 pts/1 00:00:00 ps
[root@server2 ~]# ps -eZ | grep syslog
system_u:system_r:syslogd_t 1333 ? 00:00:00 syslogd
Los estados de SELinux son enforcing, permissive (sólo avisa) o disabled. Para que los cambios
sean persistentes (modo y polítca) hay que editar /etc/sysconfig/selinux o con la herramienta
system-config-securitylevel. También son parámetros que se le pueden pasar al kernel
(selinux=0|1 o enforcing=0|1). En caliente sólo se puede pasar de permisivo a enforcing:
[root@server2 ~]# getenforce
Enforcing
[root@server2 ~]# setenforce 0
[root@server2 ~]# getenforce
Permissive
[root@server2 ~]# setenforce 1
[root@server2 ~]# getenforce
Enforcing
Para cambiar los contextos, hay que usar chcon. También está restorecon, que vuelve a dejar
los contextos originales.
chcon -R -t public_content_t /mydata/html
restorecon -vvFR /mydata/html
Las políticas de seguridad pueden incluír reglas condicionales que se pueden habilitar o
deshabilitar basandose en los valores actuales de un grupo de políticas booleanas. Para ello
tenemos getsebool y setsebool:
[root@server2 ~]# getsebool -a |grep ftp
allow_ftpd_anon_write --> off
SELinux también controla los puertos, si queremos añadir un puerto para un nuevo servidor
web (ej 81) habría que decirselo a SELinux.
[root@server2 ~]# semanage port -l |grep http
http_cache_port_t tcp 3128, 8080, 8118, 11211, 10001-10010
http_cache_port_t udp 3130, 11211
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
Los logs que SELinux escribe se pueden ver en /var/log/audit/audit.log, sin embargo, son un
poco crípticos, para lo que debemos instalar el setroubleshootd, quien procesará los mensajes
calificándolos.
Ejercicios
2.- Pese a funcionar, el problema persiste, pues NTP está corriendo sin la protección de
SELinux, hay que restaurarlo.
[root@station2 ~]# setsebool -P ntpd_disable_trans off
[root@station2 ~]# service ntpd restart
[root@station2 ~]# tail /var/log/messages
Sep 22 13:09:52 station2 ntpd[7309]: getconfig: Couldn't open </etc/ntp.conf>
Sep 22 13:09:52 station2 setroubleshoot: SELinux is preventing the ntpd from using
potentially mislabeled files (./ntp.conf). For complete SELinux messages. run sealert
-l 16fdbbb2-8952-488f-92ec-d51eaa530809
[root@station2 ~]# rpm -ql ntp |grep ntp.conf
/etc/ntp.conf
[root@station2 ~]# restorecon -v /etc/ntp.conf
restorecon reset /etc/ntp.conf context user_u:object_r:user_home_t:s0-
>system_u:object_r:net_conf_t:s0
[root@station2 ~]# service ntpd restart
Shutting down ntpd: [ OK ]
ntpd: Synchronizing with time server: [ OK ]
Starting ntpd: [ OK ]
[root@station2 ~]# ntpq -c pe
remote refid st t when poll reach delay offset jitter
==============================================================================
instructor.exam LOCAL(0) 11 u 4 64 1 0.172 -0.079 0.001
Netfilter usa 3 tablas: filter, nat y mangle. Pero en este curso, sólo nos centraremos en la tabla
de filter.
Reglas:
Las reglas se leen de arriba a abajo, por tanto hay que poner las más restrictivas siempre al
final, se usa el criterio “first match wins”. Cada regla tiene uno o varios criterios de “matching”
y un “target”. Finalmente, las cadenas tienen una política que se ejecuta cuando no se ha
encontrado ninguna regla que encaje con el paquete.
Targets:
Para la cadena INPUT son 4:
* ACCEPT : Paquete aceptado.
* DROP : No avisa del motivo por el que se deniega el paquete.
* REJECT : Avisa del motivo por el que se deniega el paquete.
* LOG : Se loga la información del paquete / regla. Es el único que permite seguir ejecutando
reglas.
Ejemplos:
Se usan para mantener las conexiones con estado activas y por tanto que Netfilter sea capaz
de permitir el paso a conexiones ya establecidas. Así el firewall trabaja a nivel de conexiones
en lugar de a nivel IP.
Ejercicios:
Ejemplo
[root@cracker2 ~]# cat /etc/hosts.allow
sshd: 192.168.0.0/225.255.255.0
[root@cracker2 ~]# cat /etc/hosts.allow
ALL: ALL
Para ver los programas que usan TCP Wrappers tenemos que ver si el binario usa la librería
libwrap.so:
[root@cracker2 ~]# which vsftpd
/usr/sbin/vsftpd
[root@cracker2 ~]# ldd /usr/sbin/vsftpd | grep wrap
libwrap.so.0 => /lib/libwrap.so.0 (0x0026a000)
Si el anterior comando no devuelve nada, podemos ver si se usan los ficheros /etc/hosts.allow
y /etc/hosts.deny por el binario en cuestion:
[root@cracker2 ~]# strings /sbin/portmap | grep hosts
hosts_access_verbose
hosts_allow_table
hosts_deny_table
/etc/hosts.allow
/etc/hosts.deny
Ejercicios
1.- Configuar accesos con TCP Wrappers. Permitiendo explicitamente que ssh esté
accesible a todos los hosts, que el resto de programas controlados por tcp wrappers
sean accesibles desde localhost pero no desde fuera y que el tftp sea accesible a los
hosts de la subred 192.168.0.0/24 únicamente.
Es un servidor web sencillo y con una arquitectura modular. Se halla en el paquete httpd y su
fichero de configuración principal es /etc/httpd/httpd.conf, pero hay más archivos en /etc/
httpd/conf.d/* y /var/www, pero también se puede usar system-config-httpd (gráfica).
Los parámetros están divididos en dos categorías global y main. En el fichero de configuración
aparece una tercera categoría, virtual. Por defecto sólo se usan las dos primeras, virtual se usa
si hay configurado un servidor virtual, heredando los parámetros de las categorías global y
main.
El contenido del servidor por defecto se aloja en /var/www/html, si queremos ponerlo en otro
sitio, tenemos que poner los contextos de SELinux correctamente (tipo httpd_sys_content_t),
nomalmente le daremos permisos 2775 y apuntar al directorio con DocumentRoot.
Si el nombre con el que se llama al Virtual Host no es exactamente igual (ej uso redhat.com
en vez de www.redhat.com) buscará uno a uno entre todos los servidores virtuales, y si no
encuentra el match exacto, usará el primero de todos. Para eso se pueden crear alias con la
directiva ServerAlias.
Apache tiene sus propias directivas de control de acceso allow y deny (no usa tcpwrappers), se
declaran dentro de cada una de las directivas Directory en las que se quiere especificar. Ésta
es la ventaja frente a las reglas del FW, ya que se aplican por directorios.
<Directory “/var/www/html/restricted”>
Order Allow,Deny
Allow from .example.com
Deny from station2.example.com station3.example.com
</Directory>
En el caso de tener una petición que no encaja, siempre se toma en consideración la úlima de
las 2 directivas especificada en Order.
12.2.- Squid
Es un proxy sencillo que soporta los protocolos HTTP, HTTPS, FTP y otros. El paquete que
lo contiene es squid y su fichero de configuración básico es /etc/squid/squid.conf, pero
también tiene archivos en /etc/squid/*. Squid no soporta tcpwrappers pero tiene sus propios
mecanismos de control de acceso.
El control de acceso en squid está basada en ACLs, siendo su declaración del tipo “acl
nombre_acl expresión”.
Ejercicios
2.- Crear un servidor web virtual, llamado www.amaya.com, al que sólo se pueda
acceder desde la subred 192.168.0.0/24.
[root@server2 ~]# vi /etc/sysconfig/iptables
-A CLASS_RULES -p tcp --dport 80 --src 192.168.0.0/24 -j ACCEPT
[root@server2 ~]# mkdir -p /var/www/virtual/www.amaya.com/html
[root@server2 ~]# echo "<H1> Amayita's Virtual Web Server </H1>" > /var/www/virtual/
www.amaya.com/html/index.html
[root@server2 ~]# vi /etc/httpd/conf.d/www.amaya.com.conf
<VirtualHost 192.168.0.102:80>
ServerName www.amaya.com
ServerAdmin root@server2.example.com
DocumentRoot /var/www/virtual/www.amaya.com/html
ErrorLog logs/www.amaya.com-error_log
CustomLog logs/www.amaya.com-access_log combined
<Directory /var/www/virtual/www.amaya.com/html>
Options Indexes Includes
</Directory>
</VirtualHost>
[root@server2 ~]# vi /etc/httpd/conf/httpd.conf
NameVirtualHost 192.168.1.102:80
Berkeley Internet Name Domain es el servidor de nombres (DNS) más comúnmente usado
en Internet, especialmente en sistemas Unix. Es un servidor de nombres. El paquete que lo
contiene es bind y bind-utils, pero el demonio es named. El principal archivo de configuración
es /etc/named.conf, pero también tiene ficheros en /var/named/*. DNS usa los puertos 53
udp/tcp y 953 tcp.
Para securizar un poco nuestro servidor DNS podemos instalar el paquete bind-chroot,
que crea un árbol chroot bajo /var/named/chroot. El comando bind-chroot-admin -e activa el
entorno chroot.
Al igual que squid, BIND usa ACLs para restringir el acceso al mismo (bind tampoco usa
tcpwrappers) y directivas allow y deny.
En el firewall hay que usar los modos RELATED y ESTABLISHED para poder comunicarnos,
dado que usa un puerto para conexiones y otro para datos. Además hay que cargar el módulo
del kernel ip_conntrack_ftp y añadir el módulo a
[root@station2 ~]# cat /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_conntrack_ftp"
[root@station2 ~]# modprobe ip_conntrack_ftp
También se puede hacer con system-config-securitylevel, pues él al abrir el puerto del ftp ya
Para evitar que un usuario acceda al servidor ftp, hemos de escribir su nombre en el fichero /
etc/vsftp/ftpusers.
Además de lo anterior, hay que tener cuidado con SELinux, por ejemplo, SELinux se encargará
de evitar que se accedan a los ficheros del home de un usuario, dado que el ftp es un
protocolo inseguro.
[root@station2 ~]# getsebool -a|grep ftp
ftp_home_dir --> off
14.2.- NFS
Sirve para exportar de manera remota FS. Hay que instalar el paqute nfs-utils. Usa los
siguientes demonios: rpc.nfsd, rpc.mountd, rpc.lock, rpc.statd, rpc.rqoutad (todos estan en /
usr/sbin). Los puertos que usa son el 111 (udp / tcp) y el 2049, además de otros 4 aleatorios, lo
mejor es fijar dichos puertos esto se hace en el fichero /etc/sysconfig/nfs.
[root@station2 ~]# more /etc/sysconfig/nfs
MOUNTD_PORT=4002
STATD_PORT=4003
LOCKD_TCPPORT=4004
LOCKD_UDPPORT=4004
RQUOTAD_PORT=4005
Para ver dónde está escuchando mi servidor NFS podemos usar rpcinfo -p servidor (rpcinfo
siempre escucha en el 111):
[root@station2 ~]# rpcinfo -p localhost
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 834 status
100024 1 tcp 837 status
Con showmount -e servidor podemos ver qué está exportando un servidor NFS.
[root@station2 ~]# showmount -e instructor.example.com
Export list for instructor.example.com:
/kickstart 192.168.1.0/255.255.255.0,192.168.0.0/255.255.255.0
/home/guests 192.168.0.0/255.255.255.0
/var/ftp/pub 192.168.1.0/255.255.255.0,192.168.0.0/255.255.255.0
Posteriormente, para montar un FS exportado por NFS sólo hay que hacer:
mount servidor:/FS_EXPORTADO /FS_LOCAL
[root@station2 ~]# mount server20:/opt /mnt/opt
14.3.- SAMBA
Samba no soporta tcpwrappers, pero sí que tiene las directovas hosts allows dentro de su
propio fichero de configuración, esta directiva se puede poner directorio por directorio.
En este fichero se configuran cada uno de los shares del servidor con sus opciones de
accesibilidad.
[root@station2 ~]# more /etc/samba/smb.conf
[homes]
comment = Home Directories
browseable = no
writable = yes
; valid users = %S
; valid users = MYDOMAIN\%S
Los usuarios de samba han de ser del sistema, pero tienen que tener su propia contraseña
samba, para ello se usa smbpasswd. Con testparm podemos ver si la sintaxis del /etc/samba/
smb.conf es correcta.
Workgroup Master
--------- -------
EXAMPLE INSTRUCTOR
MYGROUP SERVER9
Ejercicios:
1.- Configurar el servidor vsftpd para que puedan acceder usuarios anónimos pero no
locales al sistema:
[root@server2 ~]# cat /etc/sysconfig/iptables
-A CLASS_RULES -m state --state ESTABLISHED,RELATED -p tcp --dport 21 -j ACCEPT
[root@server2 ~]# cat /etc/hosts.allow
in.tftpd: 192.168.0.0/255.255.255.0
vsftpd: 192.168.0.0/255.255.255.0
[root@server2 ~]# cat /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp"
[root@server2 ~]# ftp localhost
Connected to localhost.localdomain.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (localhost:root): amaya
530 This FTP server is anonymous only.
Login failed.
ftp> 221 Goodbye.
[root@server2 ~]# ftp localhost
Connected to localhost.localdomain.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (localhost:root): anonymous
3.- Crear un servidor ftp con un directorio para subidas de ficheros anónimos. OJO con
SELinux.
[root@server2 ~]# mkdir /var/ftp/incoming
[root@server2 ~]# chgrp ftp /var/ftp/incoming/
[root@server2 ~]# chmod 2730
[root@server2 ~]# chmod 2730 /var/ftp/incoming/
[root@server2 ~]# ls -ldZ /var/ftp/incoming/
drwx-ws--- root ftp root:object_r:public_content_t /var/ftp/incoming/
[root@server2 ~]# chcon -t public_content_rw_t /var/ftp/incoming/
[root@server2 ~]# ls -ldZ /var/ftp/incoming/
drwx-ws--- root ftp root:object_r:public_content_rw_t /var/ftp/incoming/
[root@server2 ~]# setsebool -P allow_ftpd_anon_write on
[root@server2 ~]# cat /etc/sysconfig/iptables
-A CLASS_RULES -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 21 --src
192.168.0.0/24 -j ACCEPT
[root@server2 ~]# cat /etc/hosts.allow
vsftpd: 192.168.0.0/255.255.255.0
[root@server2 ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES
chown_uploads=YES
chown_username=daemon
anon_umask=077
5.- Crear una carpeta exportada con SAMBA para el grupo legal. Ojo con SELinux.
[root@server2 ~]# groupadd -g 3000 legal
[root@server2 ~]# for USER in karl joe mary jen ; do adduser -G legal -s /sbin/
nologin $USER ; done
[root@server2 ~]# for USER in karl joe mary jen root student ; do echo passwd para
$USER ; smbpasswd -a $USER ; done
[root@server2 ~]# mkdir -p /shared/legal
MUA: Un Mail User Agent es un programa de ordenador usado para leer y enviar e-mails.
MTA: Un Mail Transport Agent es uno de los programas que ejecutan los servidores
de correo, y tiene como fin transferir un conjunto de datos (correo electronico) de una
computadora a otra.
MDA: El Mail Delivery Agent es un software que acepta correo entrante desde un Mail
Transport Agent y los distribuye a los buzones de los destinatarios (si la cuenta de destino está
en la máquina local), o lo reenvía a un servidor SMTP (si los destinatarios están en máquinas
remotas).
MAA: El Mail Access Agent es un servidor POP3/IMAP usado para que los MUAs puedan
acceder al almacén de mensajes.
Una vez instalado, el servidor de correo está sólo accesible dentro de nuestra máquina:
[root@server2 ~]# netstat --listen --tcp --numeric --program
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
1727/sendmail: acce
15.3.- Postfix
Postfix usa el puerto 25 tcp para smtp, 465 tcp para smtps y 587 tcp para submission.
El fichero de configuración es /etc/postfix/mail.cf y podemos configurarlo a mano o con
postconf.
Lo primero que hay que hacer es que postfix escuche en todas las interfaces para recibir
peticiones:
[root@server2 ~]# vi /etc/postfix/mail.cf
inet_interfaces = all
mydestination son los nombres para los que yo acepto correos electrónicos (hay que
definirla en el mail.cf no las coge del entorno del sistema). En principio las cuentas de correo
electrónico que voy a tener en mi sistema, son mis usuarios unix. Para controlar el relay (los
correos que voy a enviar procedentes de mis redes de confianza) hay que usar mynetworks.
Si queremos hacer masquerading (como por ejemplo marketing.redhat.com a redhat.com)
hay que usar myorigin. Esto último no suele ser muy común hoy en día.
15.4.- Dovecot
Ejercicios