[Índice de documentos] [Sección 9 - Migración desde Linux] [Sección 11 - Mejora del rendimiento]
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).
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 - )
OpenBSD usa un inicio del estilo rc(8), para lo que necesita unos cuantos ficheros claves para iniciar.
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:
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.
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.
/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.
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`
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:
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.
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.
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.
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.
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:
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
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.
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.
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
Para más información sobre KerberosV, desde un sistema
OpenBSD, úsese la orden:
# info heimdal
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...
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!
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 ..
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.
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.
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.
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.
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/.
$ 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.
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.
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.
Para ser francos, chroot(2) Apache es algo nuevo, y muchas aplicaciones y configuraciones del sistema viejas no funcionarán como hasta ahora.
# apachectl stop && apachectl start
También se puede usar otras estrategias, como efectuar los registros en un pipe(2) y usar un rotador de registros externo en el otro extremo del pipe(2).
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.
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.
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]