[OpenBSD]

[Índice de documentos] [Sección 9 - Migración desde Linux] [Sección 11 - Mejora del rendimiento]

10 - Gestión del sistema


Índice de contenidos


10.1 - ¿Por qué me dice que estoy en el grupo erróneo cuando intento ingresar como usuario root con su(1)?

Para que un usuario normal se pueda convertir en el superusuario root, antes hay que añadir al usuario al grupo wheel a mano. Esto se hace por motivos de seguridad, y se recomienda tener cuidado con los usuarios a los que se otorgue este acceso especial. En OpenBSD, los usuarios que pertenezcan al grupo wheel podrán usar el programa su(1) en modo usuario (userland program) para tomar la identidad del superusuario root. Los usuarios que no pertenezcan al grupo wheel no podrán usar su(1). A continuación puede verse una entrada de ejemplo en el fichero /etc/group que asocia al usuario ericj al grupo wheel.

Si se va a crear un usuario nuevo con adduser(8), se puede asociar al grupo wheel desde el punto de inserción "Invite user" into other groups:, simplemente contestando wheel. De este modo el usuario quedará añadido a la línea del grupo wheel en el fichero /etc/group, que quedará del siguiente modo:

wheel:*:0:root,ericj

Si lo que se busca es un modo de permitir a los usuarios acceso limitado a los privilegios del superusuario, sin tener que asociarlos al grupo wheel, entonces se usará sudo(8).

10.2 - ¿Cómo puedo duplicar un sistema de archivos?

Para duplicar un sistema de archivos se usa dump(8) y restore(8). Por ejemplo, para duplicar todo el directorio SRC al directorio DST, se haría lo siguiente:

# cd /SRC; dump 0f - . | (cd /DST; restore -rf - )

dump está diseñado para ofrecer una gran variedad de posibilidades para copias de respaldo/seguridad, y puede resultar excesivo si sólo se quiere duplicar un único sistema de archivos o parte de éste. La orden tar(1) puede resultar más rápida para una operación de este tipo. El formato es muy parecido:

# cd /SRC; tar cf - . | (cd /DST; tar xpf - )

10.3 - ¿Cómo inicio los dæmon con el sistema? ( rc(8))

OpenBSD usa un inicio del estilo rc(8), para lo que necesita unos cuantos ficheros claves para iniciar.

¿Cómo funciona rc(8)?

Los ficheros más importantes para un administrador de sitemas son /etc/rc.conf (o /etc/rc.conf.local), /etc/rc.local y /etc/rc.shutdown. Para hacerse una idea sobre cómo funciona el procedimiento de rc(8), véase el siguiente flujo:

Después de arrancar el núcleo del sistema, se inicia /etc/rc:

Inicio de los dæmon y servicios predefinidos en OpenBSD

La mayoría de dæmon y servicios que vienen predefinidos en OpenBSD pueden iniciarse durante el arranque, editando el fichero de configuración /etc/rc.conf. Se puede ver un ejemplo en el fichero /etc/rc.conf que viene incluido con el sistema, en donde se ven unas líneas parecidas a la siguiente:

ftpd_flags=NO # for non-inetd use: ftpd_flags="-D"

Una línea como ésta nos indica que ftpd no se está iniciando con el sistema (al menos no mediante rc(8); vése la sección sobre FTP Anónimo para más información al respecto). En cualquier caso, cada línea va acompañada por un comentario que mostrará los indicadores para el uso NORMAL de ese dæmon o servicio. Esto no significa que se debe invocar el dæmon o servicio en cuestión con esos indicadores. Siempre se puede usar la documentación de man(1) (las páginas del manual) para ver cómo se puede iniciar de cualquier otro modo que se prefiera ese dæmon o servicio. Como ejemplo, véase la línea predefinida para la entrada de httpd(8):

httpd_flags=NO # for normal use: "" (or "-DSSL" after reading ssl(8))

Aquí puede verse con claridad que no es necesario ningún indicador para iniciar httpd. Por lo tanto, sólo será necesaria una línea como la siguiente:

httpd_flags=""
Pero para iniciar httpd con ssl (véase la sección sobre SSL o la página del manual de ssl(8)), será necesaria una línea como la siguiente:
httpd_flags="-DSSL"

Una buen método es no tocar nunca el fichero /etc/rc.conf, y en su lugar crear el fichero /etc/rc.conf.local, copiando en éste sólo las líneas que se quieran cambiar de /etc/rc.conf y ajustarlas según se necesite. De este modo las futuras actualizaciones pueden ser más fáciles, ya que todos los cambios estarán en este fichero.

Inicio y configuración de dæmon locales

Para instalar otros dæmon en el sistema, por medio de los portes o cualquier otro medio, se debe usar el fichero /etc/rc.local. Por ejemplo, supongamos que se ha instalado un dæmon que se encuentre en /usr/local/sbin/daemonx, y que se desea iniciar durante el arranque del sistema. Para ello pondríamos una entrada como la siguiente en /etc/rc.local:

if [ -x /usr/local/sbin/daemonx ]; then echo -n ' daemonx'; /usr/local/sbin/daemonx fi

Nota: Si el dæmon no se separa automáticamente durante el inicio, hay que añadir un "&" al final de la línea de órdenes.

Desde este momento, el dæmon será invocado durante el arranque. También se podrá ver cualquier error durante el arranque; un arranque normal sin errores sólo mostraría una línea como ésta:

Starting local daemons: daemonx.

rc.shutdown

/etc/rc.shutdown es un guión de ejecución (script) que se invoca al cerrar el sistema. Cualquier cosa que quiera hacerse antes de que se cierre el sistema se debe añadir a este fichero. Si se tiene apm también puede configurarse "powerdown=YES", lo que dará un resultado equivalente a shutdown -p.

10.4 - ¿Por qué cuando los usuarios envían correo a través de mi sistema OpenBSD se les niega el acceso de reenvío?
Relaying Denied

Probando lo siguiente:

# cat /etc/mail/sendmail.cf | grep relay-domains

la salida será parecida a ésta:

FR-o /etc/mail/relay-domains

Si este fichero no existe, habrá que crearlo, introduciendo los huéspedes que estén enviando correo remoto; para ello se utilizará la siguiente sintaxis:

.dominio.com #Permitir el reenvío desde/hacia #cualquier huésped en dominio.com sub.dominio.com #Permitir el reenvío desde/hacia #sub.dominio.com y cualquier huésped en #ese dominio 10.2 #Permitir el reenvío desde todos los #huéspedes en la red IP 10.2.*.*

No hay que olvidarse de enviar una señal 'HangUP' a sendmail (una señal que hace que la mayoría de dæmon vuelvan a leer sus respectivos ficheros de configuración):

# kill -HUP `head -1 /var/run/sendmail.pid`

Más información

10.5 - He configurado POP, pero obtengo errores cuando accedo a mi correo a través de POP. ¿Qué puedo hacer?

La mayoría de problemas relacionados con POP tienen que ver con ficheros temporales y ficheros de bloqueo. Si el servidor pop envía un mensaje de error como el siguiente,

-ERR Couldn't open temporary file, do you own it?

habrá que configurar los permisos del siguiente modo:

permisos en /var drwxrwxr-x 2 bin mail 512 May 26 20:08 mail permisos en /var/mail -rw------- 1 username username 0 May 26 20:08 username

Además, también puede comprobar que el usuario sea realmente el propietario de su propio fichero /var/mail. Por supuesto, esto debería ser así (por ejemplo, el propietario de /var/mail/joe debería ser el usuario joe), pero si no estuviera correctamente configurado podría ser la causa del problema.

Dejar /var/mail con permiso de escritura para el grupo mail crea algunos problemas de seguridad. Es probable que nunca tenga problemas con eso... ¡pero podría tenerlos! (especialmente si su sitio es de alto rendimiento, como un ISP, ...). Hay varios servidores de POP que se pueden instalar directamente desde la colección de portes. Si es posible, es recomendable usar popa3d, que se encuentra en la instalación base de OpenBSD. O podría darse el caso que tuviera seleccionadas las opciones erróneas para su dæmon 'pop' (como "dot locking"). O también es posible que necesitara cambiar el directorio que bloquea (aunque entonces, el bloqueo sólo sería de valor para el dæmon POP).

PD: Nótese que OpenBSD no tiene un grupo con el nombre "mail". Debe ser añadido en el fichero /etc/group con una entrada como ésta:

mail:*:6:

10.6 - ¿Por qué ignora Sendmail el fichero /etc/hosts

En el modo predeterminado, Sendmail no usa el fichero /etc/hosts para la resolución de nombres, sino DNS. Esto se puede cambiar a través del fichero /etc/mail/service.switch.

Si quiere enviar requerimientos al fichero /etc/hosts antes que a los servidores de DNS, debe crear un fichero /etc/mail/service.switch que contenga la siguiente línea: hosts files dns

Si quiere enviar requerimientos SÓLO al fichero /etc/hosts, use la siguiente línea: hosts files

Envíe a Sendmail una señal HUP: # kill -HUP `head -1 /var/run/sendmail.pid`

para que los cambios sean efectivos.

10.7 - Cómo se configura un servidor HTTP seguro usando SSL(8)

La distribución oficial de OpenBSD incluye un servidor httpd con SSL (Secure Sockets Layer, la capa de conectores de seguridad) y las bibliotecas de RSA. Antes de poderlas usar con httpd(8), debe crear un certificado. Este certificado se almacenará en el directorio /etc/ssl/ con la clave correspondiente en /etc/ssl/private/. Los pasos que mostraremos sobre la creación del certificado se han tomado en parte de la página del manual de ssl(8). Puede ver una información más detallada en esta página del manual. La información incluida en este documento se limita a explicar cómo crear un certificado RSA para servidores de web, no un certifificado DSA para servidores. Lea la página del manual de ssl(8) si necesita obtener más información.

Antes de empezar, necesita generar su clave de servidor y su certificado usando OpenSSL:

# openssl genrsa -out /etc/ssl/private/server.key 1024

O, si lo desea, puede cifrar la clave con una contraseña que tendrá que introducir cuando inicie los servidores:

# openssl genrsa -des3 -out /etc/ssl/private/server.key 1024

El próximo paso es generar un "Certificate Signing Request" (requerimiento para firmar el certificado), que se usa para que una Autoridad Certificadora (CA) firme su certificado. Para ello use la orden:

# openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr

El fichero server.csr se puede entregar a la Autoridad Certificadora que firmará la clave. Una de estas CA es Thawte Certification, y se puede localizar en http://www.thawte.com/.

Si no se lo puede permitir, o si quiere firmar Vd. mismo el certificado, puede usar lo siguiente:

# openssl x509 -req -days 365 -in /etc/ssl/private/server.csr \ -signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt

Con /etc/ssl/server.crt y /etc/ssl/private/server.key en su sitio ya puede iniciar httpd(8) con el indicador -DSSL (véase la sección sobre rc(8) en este documento), permitiendo transacciones https con su máquina por el puerto 443.

10.8 - He hecho cambios a /etc/passwd, pero los cambios no funcionan. ¿Por qué?

Si edita /etc/passwd directamente, cualquier cambio que haga se perderá. OpenBSD genera el fichero /etc/passwd de forma dinámica con pwd_mkdb(8). El fichero principal de las contraseñas en OpenBSD es /etc/master.passwd. De acuerdo con la página del manual de pwd_mkdb(8):

FILES /etc/master.passwd fichero de contraseña actual /etc/passwd fichero de contraseñ en formato Version 7 /etc/pwd.db fichero de base de datos de la contraseña no seguro /etc/pwd.db.tmp fichero temporal /etc/spwd.db fichero de base de datos de la contraseña seguro /etc/spwd.db.tmp fichero temporal

En un fichero de contraseñas tradicional de Unix, como /etc/passwd, toda la información, incluida la contraseña cifrada del usuario, está disponible para cualquiera que pueda acceder al sistema (y es el primer objetivo para programas como crack). 4.4BSD introdujo el fichero master.passwd, que tiene un formato extendido (con opciones adicionales que van más allá de las ofrecidas por /etc/passwd), y sólo puede ser leído por el superusuario root. Para un acceso más rápido a los datos, las llamadas de las bibliotecas que acceden a estos datos leen los ficheros /etc/pwd.db y /etc/spwd.db.

OpenBSD incluye una herramienta, vipw(8), para la edición del fichero de contraseñas. vipw usa vi(1) (nuestro editor preferido, definido por $EDITOR) para editar el fichero /etc/master.passwd. Una vez que ha terminado de editar, vuelve a crear los ficheros /etc/passwd, /etc/pwd.db, y /etc/spwd.db conforme con los cambios que haya llevado a cabo. vipw también se encarga de bloquear estos ficheros, de modo que si alguna otra persona intentara cambiarlos al mismo tiempo, no le permitiría el acceso.

10.9 - ¿Cómo añado un usuario? ¿Cómo elimino un usuario?

OpenBSD dispone de dos órdenes para añadir usuarios en el sistema fácilmente:

También es posible añadir usuarios a mano, usando vipw(8), pero en la mayoría de operaciones esto es más difícil.

En OpenBSD, la manera más fácil para añadir un usuario es usando el guión (script) adduser(8). Se puede configurar adduser(8) editando el fichero /etc/adduser.conf. adduser(8) permite que se efectúen pruebas de consistencia sobre /etc/passwd, /etc/group, y las bases de datos del intérprete. Crea las entradas y directorios $HOME. También puede enviar un mensaje de bienvenida a los nuevos usuarios. A continuación se puede ver un ejemplo de cómo se añade un nuevo usuario, testuser, a un sistema. El directorio $HOME del nuevo usuario será /home/testuser, y también se le añadirá al grupo guest, y se le asignará el intérprete /bin/ksh.

# adduser Use option ``-silent'' if you don't want to see all warnings and questions. Reading /etc/shells Reading /etc/login.conf Check /etc/master.passwd Check /etc/group Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct any input. Enter username []: testuser Enter full name []: Test FAQ User Enter shell csh ksh nologin sh [sh]: ksh Uid [1002]: Intro Login group testuser [testuser]: guest Login group is ``guest''. Invite testuser into other groups: guest no [no]: no Login class auth-defaults auth-ftp-defaults daemon default staff [default]: Intro Enter password []: Escribir la contraseña y pulsar intro Enter password again []: Escribir la contraseña y pulsar intro Name: testuser Password: **** Fullname: Test FAQ User Uid: 1002 Gid: 31 (guest) Groups: guest Login Class: default HOME: /home/testuser Shell:i /bin/ksh OK? (y/n) [y]: y Added user ``testuser'' Copy files from /etc/skel to /home/testuser Add another user? (y/n) [y]: n Goodbye!

Para eliminar usuarios debe usar la herramienta rmuser(8). De esta forma se eliminará todo vestigio de un usuario. Se eliminará cualquier entrada en crontab(1) relacionada con el usuario, su directorio $HOME (siempre que el propietario de éste sea el usuario en cuestión), y su correo. También se eliminarán sus entradas en los ficheros /etc/passwd y /etc/group.

A continuación sigue un ejemplo sobre cómo eliminar el usuario que se ha añadido en el ejemplo anterior. Verá que preguntará por el nombre, y si debe o no eliminar el directorio raíz ($HOME) del usuario.

# rmuser Enter login name for user to remove: testuser Matching password entry: introduzca la contraseña testuser:$2a$07$ZWnBOsbqMJ.ducQBfsTKUe3PL97Ve1AHWJ0A4uLamniLNXLeYrEie:1002 :31::0:0:Test FAQ User:/home/testuser:/bin/ksh Is this the entry you wish to remove? y Remove user's home directory (/home/testuser)? y Updating password file, updating databases, done. Updating group file: done. Removing user's home directory (/home/testuser): done.

Cómo añadir usuarios con user(8)

Estas herramientas son menos interactivas que la orden adduser(8), que hace que sea más fácil usarlos en guiones de ejecución (script).

La lista completa de herramientas es:

Cómo añadir usuarios

Dado que user(8) no es interactivo, la forma más fácil para añadir usuarios de modo eficiente es usar la orden adduser(8). La orden /usr/sbin/user es simplemente una interfaz para el resto de órdenes /usr/sbin/user*. Por lo tanto, las siguientes órdenes pueden ser adheridas usando user add o useradd; el modo en que lo haga sólo depende de su elección, y no altera en absoluto la función de la orden.

En este ejemplo estamos añadiendo el mismo usuario con las mismas especificaciones que usamos para el nuevo usuario de los ejemplos anteriores. La orden useradd(8) es más fácil de usar si se sabe la configuración predeterminada antes de crear el usuario. Estas configuraciones se encuentran en el fichero /etc/usermgmt.conf, y se pueden ver del siguiente modo:

$ user add -D group users base_dir /home skel_dir /etc/skel shell /bin/csh inactive 0 expire Null (unset) range 1000..60000

Las configuraciones de arriba son las que se activarán de modo predeterminado a menos que se especifiquen otras mediante opciones en la línea de órdenes. Por ejemplo, en nuestro caso, queremos que el usuario pertenezca al grupo guest, no al grupo users. Un pequeño obstáculo más al crear usuarios, es que las contraseñas se deben especificar desde la línea de órdenes. Las contraseñas están cifradas, así que será necesario usar la utilidad encrypt(1) para crearla. OpenBSD usa, de modo predeterminado, 6 veces el algoritmo Blowfish para crear la contraseña.

He aquí una línea que muestra cómo crear una contraseña para espicificarla en useradd(8).

$ encrypt -p -b 6 Enter string: $2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWXVJRzlq

Ahora que ya tenemos nuestra contraseña cifrada, estamos preparados para añadirla al usuario:

# user add -p '$2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWXVJRzlq' -u 1002 \ -s /bin/ksh -c "Test FAQ User" -m -g guest testuser

Nota: Asegúrese de usar comillas simples (' ') a ambos lados de la cadena de la contraseña, y no comillas dobles (" ") ya que éstas serían interpretadas por el intérprete de órdenes (shell) antes de enviar la cadena a user(8). Además de eso, asegúrese de especificar la opción -m si quiere que el directorio raíz del usuario sea creado y que los ficheros de /etc/skel se copien a este directorio.

Para verificar que se ha creado el usuario correctamente podemos usar muchas utilidades diferentes. A continuación hay unas cuantas órdenes que puede usar para verificar rápidamente que todo ha sido creado correctamente.

$ ls -la /home total 14 drwxr-xr-x 5 root wheel 512 May 12 14:29 . drwxr-xr-x 15 root wheel 512 Apr 25 20:52 .. drwxr-xr-x 24 ericj wheel 2560 May 12 13:38 ericj drwxr-xr-x 2 testuser guest 512 May 12 14:28 testuser $ id testuser uid=1002(testuser) gid=31(guest) groups=31(guest) $ finger testuser Login: testuser Name: Nombre Completo del Usuario Directory: /home/testuser Shell: /bin/ksh Last login Sat Apr 22 16:05 (EDT) on ttyC2 No Mail. No Plan.

Aparte de estas órdenes, user(8) dispone de, userinfo(8), su propia utilidad para mostrar las características del usuario.

$ userinfo testuser login testuser passwd * uid 1002 groups guest change Wed Dec 31 19:00:00 1969 class gecos Test FAQ User dir /home/testuser shell /bin/ksh expire Wed Dec 31 19:00:00 1969

Cómo eliminar usuarios

Para eliminar usuarios con la jerarquía de órdenes user(8), se debe usar userdel(8). Ésta es una orden muy simple, pero muy útil. Para eliminar el usuario creado en el ejemplo anterior, basta con ejecutar

# userdel -r testuser

Nótese que la opción -r se debe especificar si se desea que el directorio raíz del usuario sea también eliminado. De forma alternativa puede especificar -p y no -r, y así se bloqueará la cuenta del usuario pero no se eliminará ninguna información.

10.10 - ¿Cómo puedo crear una cuenta sólo FTP (no FTP Anónimo)?

Existen varios modos de hacerlo, pero una manera muy común es añadir /usr/bin/false en el fichero /etc/shells. Así, cuando se vincule un intérprete de usuario (user shell) a /usr/bin/false, éste no podrá ingresar de forma interactiva pero podrá usar ftp. adduser(8) les dará un directorio $HOME que será, por definición, /home/<usuario>. Si le parece bien de esta forma, no necesita cambiarlo; sin embargo, puede configurarlo a cualquier otro directorio que Vd. desee. Puede forzar que el usuario sólo pueda ver los ficheros en su directorio $HOME, añadiendo su nombre de usuario al fichero /etc/ftpchroot. Mediante el uso de la opción -A para ftpd(8), puede restringir los ingresos (login) para que sólo sean posibles por ftpchroot.

10.11 - Configuración de cuotas de disco

Las cuotas se usan para limitar el espacio del que disponen los usuarios en sus discos. Puede ser muy útil en situaciones en las que los recursos disponibles sean limitados. Existen dos configuraciones posibles para las cuotas, cuotas de usuario y/o cuotas de grupo.

El primer paso para configurar cuotas es asegurarse de que la opción QUOTA se encuentra activada en la configuración del núcleo del sistema. Esta opción está configurada en el núcleo GENERIC. Después se deben marcar los sistemas de archivo para los que se vaya a configurar las cuotas en /etc/fstab. Esto se hace usando las palabras clave userquota y groupquota para marcar cada uno de los sistemas de archivo en el que se usarán las cuotas. Por definición, los ficheros quota.user y quota.group se crearán en la raíz de ese sistema de archivos, que tendrá la información sobre las cuotas. Esto se puede anular especificando el nombre del fichero con la opción quota en /etc/fstab, v.g. "userquota=/var/quotas/quota.user". He aquí un ejemplo de /etc/fstab con sólo un sistema de archivos con las cuotas de usuario activadas, y el fichero de cuotas en una ubicación atípica:

/dev/wd0a / ffs rw,userquota=/var/quotas/quota.user 1 1

Ahora ya puede configurar las cuotas de usuario. Para ello use la utilidad edquota(8). Una forma simple de usarlo es "edquota <usuario>". La orden edquota(8) usar´ vi(1) para editar las cuotas a menos que la variable de entorno EDITOR indique un editor diferente. Por ejemplo:

# edquota ericj

Esto dará un resultado parecido al siguiente:

Quotas for user ericj: /: blocks in use: 62, limits (soft = 0, hard = 0) inodes in use: 25, limits (soft = 0, hard = 0)

Para añadir límites, debe quedar algo como esto:

Quotas for user ericj: /: blocks in use: 62, limits (soft = 1000, hard = 1050) inodes in use: 25, limits (soft = 0, hard = 0)

Nótese que las cuotas están repartidas en bloques de 1KB. En este caso, el "softlimit" es de 1000KB bloques, y el "hardlimit" de 1050KB. softlimit es el límite en el cual el usuario recibe un aviso cuando lo sobrepasa, y tiene hasta su periodo de gracia para rebajar su uso del disco por debajo de su límite. Los periodos de gracia se pueden configurar usando la opción -t con la orden edquota(8). Después de que el periodo de gracia haya pasado, el "softlimit" se toma como "hardlimit". El resultado es un fallo de ubicación (allocation failure).

Una vez que las cuotas ya están configuradas, tiene que activarlas. Para ello use quotaon(8). Por ejemplo:

# quotaon -a

De este modo repasará /etc/fstab para activar los sistemas de archivo con opciones de cuota. En cuanto las cuotas estén funcionando, puede verlas con quota(1). Si usa la orden "quota <usuario>" obtendrá la información sobre el usuario que especifique. Al ser invocada sin argumentos, la orden quota(8) le dará sus estadísticas de cuotas. Por ejemplo:

# quota ericj

Dará como resultado algo como esto:

Disk quotas for user ericj (uid 1001): Filesystem blocks quota limit grace files quota limit grace / 62 1000 1050 27 0 0

Las cuotas que estén configuradas en /etc/fstab iniciarén durante el arranque por definición. Para desactivarlo use:

# quotaoff -a

10.12 - Cómo se configuran los clientes y servidores KerberosV en OpenBSD

Para más información sobre KerberosV, desde un sistema OpenBSD, úsese la orden: # info heimdal

10.13 - Configuración de servicios de FTP Anónimo

FTP Anónimo permite a los usuarios que carecen de cuentas en el sistema, acceder a ficheros en su máquina mediante el «Protocolo de Transferencia de Ficheros» (FTP, "File Transfer Protocol"). Esta sección ofrece un resumen sobre cómo configurar el servidor de ftp anónimo, su ingreso, etc...

Creación de la cuenta de FTP

Para empezar, necesita tener una cuenta "ftp" en su sistema. Esta cuenta no debe tener una contraseña utilizable. Aquí configuraremos el directorio de ingreso como /home/ftp, pero puede ponerlos donde quiera. Cuando use ftp anónimo, el dæmon de ftp ejecutará chroot sobre sí mismo para cambiar la directorio del usuario de ftp. Puede leer más sobre esto en las páginas de manual de ftp(8) y chroot(2). He aquí un ejemplo sobre cómo añadir el usuario ftp. Para ello usaremos adduser(8). También necesitamos añadir /usr/bin/false a nuestro fichero /etc/shells, que será la shell que configuraremos para el usuario ftp. Así no tendrán permiso para ingresar, aunque les daremos una contraseña vacía. Para ello puede hacer simplemente lo siguiente: echo /usr/bin/false >> /etc/shells También, si quiere que esa shell se muestre durante las preguntas de la orden adduser, necesita modificar /etc/adduser.conf.

# adduser Use option ``-silent'' if you don't want to see all warnings and questions. Reading /etc/shells Reading /etc/login.conf Check /etc/master.passwd Check /etc/group Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct any input. Enter username []: ftp Enter full name []: anonymous ftp Enter shell csh false ksh nologin sh tcsh zsh [sh]: false Uid [1002]: Intro Login group ftp [ftp]: Intro Login group is ``ftp''. Invite ftp into other groups: guest no [no]: no Login class auth-defaults auth-ftp-defaults daemon default staff [default]: Intro Enter password []: Intro Set the password so that user cannot logon? (y/n) [n]: y Name: ftp Password: **** Fullname: anonymous ftp Uid: 1002 Gid: 1002 (ftp) Groups: ftp Login Class: default HOME: /home/ftp Shell: /usr/bin/false OK? (y/n) [y]: y Added user ``ftp'' Copy files from /etc/skel to /home/ftp Add another user? (y/n) [y]: n Goodbye!

Configuración del directorio

Además del usuario, ha creado el directorio /home/ftp. Es lo que queremos, pero hay algunos cambios que tendremos que hacer para tenerlo preparado para ftp anónimo. Estos cambios se explican en la página de manual de ftp(8).

No necesita crear un directorio /home/ftp/usr o /home/ftp/bin.

Note que el propietario de todos estos directorios debería ser ``root''. He aquí una lista de cómo deberían ser los directorios después de ser creados:

# pwd /home # ls -laR ftp total 5 dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 . drwxr-xr-x 7 root wheel 512 Jul 6 10:58 .. dr-x--x--x 2 root ftp 512 Jul 6 11:34 etc dr-xr-xr-x 2 root ftp 512 Jul 6 11:33 pub ftp/etc: total 43 dr-x--x--x 2 root ftp 512 Jul 6 11:34 . dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 .. -r--r--r-- 1 root ftp 316 Jul 6 11:34 group -r--r--r-- 1 root ftp 40960 Jul 6 11:34 pwd.db ftp/pub: total 2 dr-xr-xr-x 2 root ftp 512 Jul 6 11:33 . dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 ..

Inicio del servidor e ingreso

Con ftpd(8) puede escoger entre invocarlo desde inetd(8) o lo pueden iniciar los guiones de configuración de rc(8). En estos ejemplos se verá cómo se inicia nuestro dæmon desde inetd.conf. Primero debemos familiarizarnos con algunas de las opciones de ftpd. La línea por definición de /etc/inetd.conf es:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -US

En este caso ftpd se invoca con -US. Así se grabarán las conexiones anónimas a /var/log/ftpd, y las sesiones concurrentes a /var/run/utmp. De este modo, podremos ver estas sesiones con la orden who(1). Es posible que algunos sólo quisieran tener un servidor anónimo, y desactivar ftp para usuarios. Para ello debe invocar ftpd con la opción -A. He aquí una línea que inicia ftpd para conexiones anónimas sólo. También usa -ll para grabar cada conexión a syslog, junto con las órdenes de ftp 'get', 'retrieve', etc.

ftp stream tcp nowait root /usr/libexec/tcpd ftpd -llUSA

Nota: Para aquéllos que usen servidores de ftp de MUCHO tráfico, es conveniente que no invoquen ftpd desde inetd.conf. La mejor opción es comentar la línea de ftpd de inetd.conf e iniciar ftpd desde rc.conf junto con la opción -D. De este modo iniciarán ftpd como un dæmon, y será más simple que iniciarlo desde inetd. A continuación viene un ejemplo de cómo iniciarlo desde rc.conf:

ftpd_flags="-DllUSA" # for non-inetd use: ftpd_flags="-D"

Esto sólo funcionará si se ha desactivado ftpd en /etc/inetd.conf y se ha forzado a inetd a leer su fichero de configuración.

Otros ficheros de importancia

10.14 - Cómo se confina a los usuarios a sus directorios de usuario (/home) en ftpd(8)

En OpenBSD, ftpd(8) está configurado por definición para poder gestionar esto de modo muy fácil. Se hace por medio del fichero /etc/ftpchroot. Como los usuarios no son siempre fiables, puede ser necesario restringir su entrada en otros directorios que no sean el propio. Esto NO está activado por definición. He aquí un ejemplo de cómo responde por definición:

$ ftp localhost Connected to localhost. 220 oshibana FTP server (Version 6.4/OpenBSD) ready. Name (localhost:ericj): ericj 331 Password required for ericj. Password: ********* 230- OpenBSD 3.4 (GENERIC) #18: Wed Sep 17 03:34:47 MDT 2003 230- 230- Welcome to OpenBSD: The proactively secure Unix-like operating system. 230- 230- Please use the sendbug(1) utility to report bugs in the system. 230- Before reporting a bug, please try to reproduce it with the latest 230- version of the code. With bug reports, please try to ensure that 230- enough information to reproduce the problem is enclosed, and if a 230- known fix for it exists, include that as well. 230- 230 User ericj logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd / 250 CWD command successful. ftp> ls 227 Entering Passive Mode (127,0,0,1,60,7) 150 Opening ASCII mode data connection for 'file list'. altroot bin dev etc home mnt root sbin stand tmp usr var bsd sys boot 226 Transfer complete. ftp> quit 221 Goodbye.

Como puede ver, el acceso está permitido para todo el servidor. En un mundo perfecto esto debería ser así, deberíamos poder fiarnos de todos los usuarios, pero no es así. Para limitar un usuario, añada su nombre al fichero /etc/ftpchroot. He aquí un ejemplo que muestra cómo restringir al usuario "ericj":

$ cat /etc/ftpchroot # $ OpenBSD: ftpchroot,v 1.3 1996/07/18 12:12:47 deraadt Exp $ # # list of users (one per line) given ftp access to a chrooted area. # read by ftpd(8). ericj

Esto es suficiente para evitar que el usuario "ericj" se escape de su propio directorio. Como puede ver en el siguiente ejemplo, el directorio / ha cambiado de repente a su directorio de usuario.

$ ftp localhost Connected to localhost. 220 oshibana FTP server (Version 6.4/OpenBSD) ready. Name (localhost:ericj): ericj 331 Password required for ericj. Password: ********* 230 User ericj logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd / 250 CWD command successful. ftp> ls 227 Entering Passive Mode (127,0,0,1,92,171) 150 Opening ASCII mode data connection for 'file list'. .login .mailrc .profile .rhosts .ssh .cshrc work mail src 226 Transfer complete. ftp> quit 221 Goodbye.

10.15 - Cómo se aplican parches en OpenBSD

El árbol de fuentes de OpenBSD experimenta cambios y mejoras continuamente, y al mismo tiempo se ponen a disponibilidad pública parches para problemas comunes con bastante frecuencia. Estos parches aparecen en la página web de erratas, que puede encontrar en http://www.openbsd.org/es/errata.html, y se encuentran separados por categorías. Estas categorías corresponden a los parches que se deberían aplicar a las diferentes arquitecturas, o a parches independientes de la arquitectura.

Sin embargo, no se producen parches para las nuevas funcionalidades añadidas al sistema, y sólo se producen para solucionar problemas de fiabilidad o de seguridad que deban ser atajados inmediatamente, aunque la última palabra sobre si se deben aplicar o no la tiene siempre el administrador del sistema.

A modo de ejemplo parchearé talkd(8) con un parche de seguridad obtenido de errata.html.

¿En qué se diferencian estos parches de los que se pueden encontrar en el árbol de fuentes?

Todos los parches que se envían a http://www.openbsd.org/es/errata.html son parches que se aplican directamente al árbol de fuentes de la versión oficial más reciente. Los parches que se aplican al árbol de CVS más reciente también incluyen otros cambios que no son deseables en un sistema con la versión oficial.

Preparación del sistema para la aplicación de parches

Los parches para el Sistema Operativo OpenBSD se distribuyen como ficheros diff, que son ficheros de texto en los que se encuentran las diferencias con el código fuente original. NO se distribuyen en formato binario. Esto quiere decir que para aplicar un parche al sistema, antes es necesario disponer del código fuente de la versión final (-release) de OpenBSD. Esto no significa que deba disponer de TODO el código fuente del sistema operativo, sino que debe tener todo el código para el programa al que vaya a aplicar el parche. Por ejemplo, si va a aplicar un parche al núcleo del sistema, debe tener a mano todo el código fuente para el núcleo.

cvs(1) es una herramienta muy útil que puede usar para obtener el código fuente que necesite por medio de los servidores anónimos de cvs ubicados alrededor del mundo. Puede ver un listado de estos servidores en http://www.openbsd.org/es/anoncvs.html.

Para obtener obtener el código fuente de talkd(8) para OpenBSD 3.4-release usando cvs(1), hay que hacer lo siguiente:

$ export CVSROOT=anoncvs@anoncvs5.usa.openbsd.org:/cvs $ cvs co -rOPENBSD_3_4_BASE src/libexec/talkd/ cvs server: Updating src/libexec/talkd U src/libexec/talkd/announce.c U src/libexec/talkd/talkd.c U src/libexec/talkd/talkd.h

Para encontrar en el CVS el camino hasta el código que necesita, puede verlo en la línea Index: del parche. En este caso el camino en el CVS era src/libexec/talkd/. Compruebe siempre el número de revisión de OPENBSD_version_number_BASE. Sin "_BASE" obtendrá el código de la rama estable, y ésta puede contener otros cambios que sin duda interferirán. Si ya está siguiendo la rama de parches, los parches ya deberían estar en ese código fuente, pero por si acaso debería comprobarlo y asegurarse. Siempre puede mirar en http://www.openbsd.org/plus.html para ver qué parches se han aplicado a la rama de parches. Si los parches todavía no han sido aplicados, tendrá que obtener el código fuente de la última versión usando la orden anterior.

Los usuarios que hayan adquirido los CDs oficiales de OpenBSD pueden obtener el código fuente directamente desde el CD. Mire en la carátula del CD para saber cómo extraer el código fuente desde el mismo. En este caso no será necesaria la obtención del código fuente por medio de anoncvs.

Aplicar del siguiente modo: cd /usr/src patch -p0 < 026_talkd.patch cd libexec/talkd make obj && make depend && make && make install Index: libexec/talkd/announce.c <------ Camino a los fuentes =================================================================== RCS file: /cvs/src/libexec/talkd/announce.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- libexec/talkd/announce.c 1998/08/18 03:42:10 1.8 +++ libexec/talkd/announce.c 2000/07/06 00:01:45 1.9 @@ -160,6 +160,6 @@ *(bptr++) = '\n'; } *bptr = '\0'; - fprintf(tf, big_buf); + fprintf(tf, "%s", big_buf); fflush(tf); }

Una vez que haya obtenido el código fuente correcto, puede obtener el parche y ponerlo en src/.

Aplicación de los parches

$ cd /usr/src $ patch -p0</path/to/026_talkd.patch Hmm... Looks like a unified diff to me... The text leading up to this was: -------------------------- |Aplicar del siguiente modo: | cd /usr/src | patch -p0 < 026_talkd.patch | cd libexec/talkd | make obj && make depend && make && make install | |Index: libexec/talkd/announce.c |=================================================================== |RCS file: /cvs/src/libexec/talkd/announce.c,v |retrieving revision 1.8 |retrieving revision 1.9 |diff -u -r1.8 -r1.9 |--- libexec/talkd/announce.c 1998/08/18 03:42:10 1.8 |+++ libexec/talkd/announce.c 2000/07/06 00:01:45 1.9 -------------------------- Patching file libexec/talkd/announce.c using Plan A... Hunk #1 succeeded at 160. <------------ Parche con éxito done $ cd /usr/src/libexec/talkd/ $ ls CVS announce.c print.c table.c talkd.c Makefile announce.c.orig process.c talkd.8 talkd.h $ make obj && make depend && make making /home/ericj/lsrc/src/libexec/talkd/obj mkdep -a /home/ericj/lsrc/src/libexec/talkd/talkd.c /home/ericj/lsrc/sr c/libexec/talkd/announce.c /home/ericj/lsrc/src/libexec/talkd/process.c /home/ericj/lsrc/src/libexec/talkd/table.c /home/ericj/lsrc/src/libexec /talkd/print.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/talkd.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/announce.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/process.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/table.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/print.c cc -o ntalkd talkd.o announce.o process.o table.o print.o nroff -Tascii -mandoc /home/ericj/lsrc/src/libexec/talkd/talkd.8 > talk d.cat8 $ sudo make install install -c -s -o root -g bin -m 555 ntalkd /usr/libexec install -c -o root -g bin -m 444 talkd.cat8 /usr/share/man/cat8/talkd.0 /usr/share/man/cat8/ntalkd.0 -> /usr/share/man/cat8/talkd.0

Una vez hecho esto, reinicie ese servicio.

10.16 - Acerca de chroot() Apache

En OpenBSD, el servidor de httpd(8) de Apache tiene el entorno chroot(2) activado por definición. Aunque esto sea un incremento en la seguridad, puede crear problemas si no se está preparado para ello.

¿Qué es chroot?

Una aplicación con el entorno chroot(2) activado se encuentra encerrada en un directorio particular y no puede pasar al resto del árbol del directorio, y ve ese directorio como su directorio raíz ("/"). En el caso de httpd(8), el programa se inicia, abre sus archivos de registro, se vincula a sus puertos TCP (aunque aún no aceptará datos), y lee su configuración. A continuación, se bloquea en /var/www y pierde los privilegios, y entonces empieza a aceptar requerimientos. Esto quiere decir que todos los archivos que sirva y que utilice Apache deben estar en el directorio /var/www. Esto representa una gran ventaja para la seguridad; si hubiera algún problema de seguridad con Apache, el daño quedaría confinado a un solo directorio con permisos de sólo lectura y sin recursos con los que causar ningún daño.

¿Qué implicaciones tiene esto para el usuario?

Para ser francos, chroot(2) Apache es algo nuevo, y muchas aplicaciones y configuraciones del sistema viejas no funcionarán como hasta ahora.

En algunos casos, se puede alterar la aplicación o su configuración para que se ejecute sin chroot. En otros casos, no quedará más remedio que desactivar esta funcionalidad usando la opción -u de httpd(8) en /etc/rc.conf.

10.17 - ¡No me gusta el intérprete preasignado al usuario root!

El intérprete de órdenes preasignado al superusuario (root shell) en OpenBSD es csh, debido principalmente a una cuestión de tradición, aunque csh(1) no es ningún requisito obligatorio para el ingreso como superusuario (pero antes de cambiarlo es muy aconsejable leer el resto de estas líneas).

Algunos usuarios que provienen de otros sistemas operativos tipo Unix se encuentran con que csh(1) no es nada familiar, y en seguida preguntan cómo pueden cambiarlo. Existen algunas opciones:

Una regla tradicional en Unix es la de usar para el superusuario sólo intérpretes de órdenes compilados de modo estático debido a que, si el sistema tuviera que ser iniciado en modo mono-usuario, las particiones que no fueran la de root no se montarían y un intérprete enlazado de modo dinámico no podría acceder a las bibliotecas ubicadas en la partición /usr. De cualquier modo esto no representa un problema importante para OpenBSD, ya que el sistema pediría que se asignase un intérprete en cuanto se iniciara en modo mono-usuario, y el intérprete predeterminado en el sistema es sh. Los tres intérpretes de órdenes estándar en OpenBSD, ( csh, sh y ksh), están enlazados de modo estático, y por lo tanto se pueden utilizar en el modo mono-usuario.

Algunas personas dicen que no se debe cambiar nunca el intérprete preasignado del superusuario, aunque no existe ningún motivo para no hacerlo en OpenBSD. De cualquier modo esto no es importante, ya que no se debe ingresar en un sistema directamente como usuario root.

10.18 - ¿Qué más puedo hacer con el intérprete ksh?

En OpenBSD, ksh es pdksh, Public Domain Korn Shell, y es el mismo fichero binario que sh.

Los usuarios que estén acostumbrados a bash, muy usado en los sistemas basados en Linux, es probable que encuentren ksh muy parecido. Ksh(1) dispone de la mayoría de funcionalidades que se encuentran en bash, incluida la terminación mediante tabulador, la edición de la lína de órdenes y de su historial por medio de las flechas del teclado, y el uso de CTRL-A/CTRL-E para saltar al principio/final de la línea de órdenes. Si se requieren otras funcionalidades de bash, se puede instalar bash como un porte compilable o como un paquete precompilado.

El punto de inserción (prompt) de órdenes de ksh se puede cambiar fácilmente por algo que provea más información que el predefinido "$ " mediante la configuración de la variable PS1. Por ejemplo, si añado la siguiente línea: export PS1='$PWD $ ' al fichero /etc/profile, el punto de inserción se vería como: /home/nick $

En el fichero /etc/ksh.kshrc, se incluyen muchas funcionalidades y ejemplos, y este fichero se puede invocar desde el fichero .profile.

[Índice de documentos] [Sección 9 - Consejos para usuarios de Linux] [Sección 11 - Mejora del rendimiento]


[índice] www@openbsd.org
Originally [OpenBSD: faq10.html,v 1.96 ]
$Translation: faq10.html,v 1.52 2004/01/04 19:59:58 horacio Exp $
$OpenBSD: faq10.html,v 1.50 2004/01/04 22:23:56 horacio Exp $