Páginas

Mostrando entradas con la etiqueta permisos. Mostrar todas las entradas
Mostrando entradas con la etiqueta permisos. Mostrar todas las entradas

martes, 26 de agosto de 2025

Poudriere en FreeBSD ZFS 14.2

Instalación y configuración de poudriere FreeBSD 14.2 ZFS


Referencias bibliográficas:

https://freebsdfoundation.org/wp-content/uploads/2023/11/reushling_poudrier.pdf
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-poudriere-build-system-to-create-packages-for-your-freebsd-servers


Intel core i5-8350U 1.7 GHz
Procesador 4 cores
Procesador 8 hilos
RAM 16 GB
SWAP 16 GB
NVMe Pcie 4.0

ZPOOL=zroot
ZROOTFS=/poudriere
BASEFS=/usr/local/poudriere

FreeBSD 14.2-RELEASE (amd64) instalado El dataset raíz de poudriere estará en zroot/poudriere y se montará en /usr/local/poudriere

Paquetes mínimos

pkg install -y poudriere \
	       git-lite
	       vim
	       screen
	       curl
	       ca_root_nss

Crear datasets ZFS.

Ventajas: posibilidad de hacer snapshots, rollback y compression por separado

zfs create -o mountpoint=/usr/local/poudriere -o compression=lz4 zroot/poudriere
zfs create zroot/poudriere/jails
zfs create zroot/poudriere/ports
zfs create zroot/poudriere/data
zfs create zroot/poudriere/data/packages
zfs create zroot/poudriere/data/logs

Archivo /usr/local/etc/poudriere.conf

ZPOOL=zroot
ZROOTFS=/poudriere
FREEBSD_HOST=ftp://ftp.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/usr/local/poudriere
POUDRIERE_DATA=${BASEFS}/data
USE_TMPFS="wrkdir data localbase"
DISTFILES_CACHE=/usr/ports/distfiles
CHECK_CHANGED_OPTIONS=verbose
CHECK_CHANGED_DEPS=yes
CCACHE_DIR=/var/cache/ccache
ALLOW_MAKE_JOBS_PACKAGES="llvm* rust firefox gcc*"
PARALLEL_JOBS=2 # 2 hilos logicos
KEEP_OLD_PACKAGES=yes
MAX_JOBS=2
NOHANG_TIME=7200
NOCOLOR=no

Descargar y crear la jail base (14.2-RELEASE)

poudriere jail -c -j 142amd64 -v 14.2-RELEASE -a amd64

Esto descarga sets.txz y crea un dataset zroot/poudriere/jails/142amd64

Crear de nuevo arbol de puertos (quarterly)

poudriere ports -c -p default -m git+https -U \
https://git.FreeBSD.org/ports.git -B 2026Q1     

poudriere ports -l

PORTSTREE METHOD    TIMESTAMP           PATH
default   git+https 2025-08-24 18:50:19 /usr/local/poudriere/ports/default

poudriere jails -l

JAILNAME VERSION         ARCH  METHOD TIMESTAMP           PATH
142amd64 14.2-RELEASE-p5 amd64 http   2025-08-24 18:42:25 /usr/local/poudriere/jails/142amd64

Ajustes globales

Archivo /usr/local/etc/poudriere.d/142amd64-make.conf

# Opciones generales para la jaula 142amd64
DEFAULT_VERSIONS+=ssh=openssl
OPTIONS_UNSET+=DOCS NLS EXAMPLES IPV6
DISABLE_LICENSES=yes

Crear listas de paquetes

Archivo /usr/local/etc/poudriere.d/port-list.txt

security/sudo

Archivo de configuracion de /var/cache/ccache/ccache.conf

max_size = 5.0G
cache_dir = /var/cache/ccache
compression = true
compression_level = 1
sloppiness = file_stat_matches, time_macros, include_file_mtime
hash_dir = false
run_second_cpp = false

Primer bulk build

poudriere bulk -j 142amd64 -p default -f /usr/local/etc/poudriere.d/port-list.txt

Servidor de paquetes local (nginx)

pkg install nginx
sysrc nginx_enable=YES

Archivo de configuración de nginx

$ sed -e '/^[ ]*#/d' -e '/^$/d' /usr/local/etc/nginx/nginx.conf
    
    server {
        listen       80 default;
        server_name  localhost;
	    root /usr/local/share/poudriere/html;
        
        location /data {
            alias  /usr/local/poudriere/data/logs/bulk;
            autoindex on;
        }
	
	location /packages {
		root /usr/local/poudriere/data;
		autoindex on;
	}
}

Configurar pkg en la máquina anfitriona

mkdir /usr/local/etc/pkg/repos

Archivo /usr/local/etc/pkg/repos/poudriere.conf

poudriere {
  url: "http://127.0.0.1/packages/142amd64-default/",
  enabled = yes,
  mirror_type: "http",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/poudriere/poudriere.pub",
}

Generar clave (una sola vez)

Crear el directorio donde se guardarán las claves

mkdir -p /usr/local/etc/poudriere

Generar la clave privada (4096 bits)

openssl genrsa -out /usr/local/etc/poudriere/poudriere.key 4096
chmod 600 /usr/local/etc/poudriere/poudriere.key

Extraer la clave pública

openssl rsa -in /usr/local/etc/poudriere/poudriere.key -pubout -out \
/usr/local/etc/poudriere/poudriere.pub
chmod 644 /usr/local/etc/poudriere/poudriere.pub

Asegúrarse de que poudiere la use al firmar.

Añadir esta línea al archivo /usr/local/etc/poudriere.conf

PKG_REPO_SIGNING_KEY=/usr/local/etc/poudriere/poudriere.key

El archivo /usr/local/etc/poudriere.conf queda así:

ZPOOL=zroot
ZROOTFS=/poudriere
FREEBSD_HOST=ftp://ftp.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/usr/local/poudriere
POUDRIERE_DATA=${BASEFS}/data
USE_TMPFS=all # usa RAM + swap para las builds
DISTFILES_CACHE=/usr/ports/distfiles
CHECK_CHANGED_OPTIONS=verbose
CHECK_CHANGED_DEPS=yes
ALLOW_MAKE_JOBS_PACKAGES="pkg ccache py* rust llvm*"
PARALLEL_JOBS=8 # 8 hilos logicos
PKG_REPO_SIGNING_KEY=/usr/local/etc/poudriere/poudriere.key

Firmar el repositorio con la clave nueva

poudriere bulk -j 142amd64 -p default -f /usr/local/etc/poudriere.d/port-list.txt

Monitorear durante la compilación


poudriere status

SET PORTS JAIL BUILD STATUS  QUEUE BUILT FAIL SKIP IGNORE FETCH REMAIN TIME     LOGS
- default 142amd64 2025-08-26_08h57m21s parallel_build  3  0  0  0 0 0  3 00:00:22 \
/usr/local/poudriere/data/logs/bulk/142amd64-default/2025-08-26_08h57m21s

poudriere jail -l

JAILNAME VERSION         ARCH  METHOD TIMESTAMP           PATH
142amd64 14.2-RELEASE-p5 amd64 http   2025-08-25 23:10:54 /usr/local/poudriere/jails/142amd64

poudriere ports -l

PORTSTREE METHOD    TIMESTAMP           PATH
default   git+https 2025-08-26 08:55:04 /usr/local/poudriere/ports/default
local     null      2025-08-24 16:41:27 /usr/local/poudriere/ports/default
root@solaris:/usr/local/etc/pkg/repos# poudriere 
FreeBSD.conf        packagesite.yaml    
poudriere.conf     

Logs en tiempo real

poudriere log -f -j 142amd64 -p default 

Configurar pkg en los clientes, (o en la misma máquina), para que use la clave pública

mkdir -p /usr/local/etc/pkg/repos/
$ cat /usr/local/etc/pkg/repos/poudriere.conf
poudriere {
  url: "http://127.0.0.1/packages/142amd64-default/",
  enabled = yes,
  mirror_type: "http",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/poudriere/poudriere.pub",
}

Tras esto, pkg install validará las firmas sin errores.

Comandos útiles de rescate. Limpiar paquetes obsoletos

poudriere pkgclean -j 142amd64 -p default -f port-list.txt

Destruir jail y volver a crear (por ejemplo, tras nueva RELEASE)

poudriere jail -d -j 142amd64
poudriere jail -c -j 142amd64 -v 14.3-RELEASE -a amd64

Actualizar paquetes

pkg update -f
Updating FreeBSD repository catalogue...
Fetching meta.conf: 100%    179 B   0.2kB/s    00:01    
Fetching data.pkg: 100%   10 MiB  10.4MB/s    00:01    
Processing entries: 100%
FreeBSD repository update completed. 35669 packages processed.
Updating poudriere repository catalogue...
Fetching meta.conf: 100%    179 B   0.2kB/s    00:01    
Fetching data.pkg: 100%    2 KiB   2.0kB/s    00:01    
Processing entries: 100%
poudriere repository update completed. 3 packages processed.
All repositories are up to date.
pkg upgrade
curl -I http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.28.0
Date: Tue, 26 Aug 2025 12:07:38 GMT
Content-Type: text/html
Content-Length: 13036
Last-Modified: Sat, 09 Aug 2025 09:58:45 GMT
Connection: keep-alive
ETag: "68971bd5-32ec"
Accept-Ranges: bytes

Actualizar el árbol existente (lo mantiene, solo descarga nuevos commits)

poudriere ports -u -p default

Listo para compilar y servir paquetes locales con poudriere en FreeBSD 14.2


Opciones

Poudriere no guarda automáticamente las elecciones que se hacen al ejecutar poudriere options, pero le indicamos con la bandera -z myset que lo guarde.

Ejecutar una vez poudriere options para el port que quiera

Las opciones seleccionadas se guardan en /usr/local/etc/poudriere.d/myset-options

poudriere options -z myset -c security/sudo

el flag -c fuerza que aparezca el menú incluso si ya existen opciones guardadas.


Un directorio "myset-options" es generado automaticamente por make config

/usr/local/etc/poudriere.d/myset-options/

y dentro del directorio los directorios categoria_paquete

ls /usr/local/etc/poudriere.d/myset-options
converters_libiconv/ devel_autoconf/      devel_m4/            lang_tcl86/
databases_sqlite3/   devel_kyua/          lang_lua54/          security_sudo/
devel_atf/           devel_lutok/         lang_perl5.42/

y dentro de esos directorio un archivo llamado options contiene las opciones de configuración.


cat /usr/local/etc/poudriere.d/myset-options/security_sudo/options
# This file is auto-generated by 'make config'.
# Options for sudo-1.9.17p2
_OPTIONS_READ=sudo-1.9.17p2
_FILE_COMPLETE_OPTIONS_LIST=AUDIT DISABLE_AUTH DISABLE_ROOT_SUDO DOCS EXAMPLES \
INSULTS LDAP NLS NOARGS_SHELL OPIE PAM PYTHON SSL GSSAPI_BASE GSSAPI_HEIMDAL \
GSSAPI_MIT
OPTIONS_FILE_SET+=AUDIT
OPTIONS_FILE_UNSET+=DISABLE_AUTH
OPTIONS_FILE_UNSET+=DISABLE_ROOT_SUDO
OPTIONS_FILE_UNSET+=DOCS
OPTIONS_FILE_UNSET+=EXAMPLES
OPTIONS_FILE_SET+=INSULTS
OPTIONS_FILE_UNSET+=LDAP
OPTIONS_FILE_UNSET+=NLS
OPTIONS_FILE_UNSET+=NOARGS_SHELL
OPTIONS_FILE_UNSET+=OPIE
OPTIONS_FILE_SET+=PAM
OPTIONS_FILE_UNSET+=PYTHON
OPTIONS_FILE_SET+=SSL
OPTIONS_FILE_UNSET+=GSSAPI_BASE
OPTIONS_FILE_UNSET+=GSSAPI_HEIMDAL
OPTIONS_FILE_UNSET+=GSSAPI_MIT

...

Compilar paquetes

poudriere bulk -j 142amd64 -p default -z myset -f /usr/local/etc/poudriere.d/port-list.txt

Para que pkg use los paquetes que acaba de compilar poudriere necesitas:
- Que poudriere haya terminado de firmar y publicar los paquetes.
- Un repositorio local servido por nginx (u otro)
- Un fichero /usr/local/etc/pkg/repos/poudriere.conf correctamente escrito

fichero /usr/local/etc/pkg/repos/poudriere.conf

poudriere {
  url: "http://127.0.0.1/packages/142amd64-default/",
  # url = "file:///usr/local/poudriere/data/packages/142amd64-default",
  enabled = yes,
  mirror_type: "http",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/poudriere/poudriere.pub",
}
root@solaris:/usr/local/poudriere/data/packages/142amd64-default/All# pkg repo .
Creating repository in .: 100%
Packing files for repository: 100%
root@solaris:/usr/local/poudriere/data/packages/142amd64-default/All# ls
data.pkg            meta.conf           pkg-2.2.2.pkg
data.tzst           packagesite.pkg     pkgconf-2.4.3,1.pkg
meta                packagesite.tzst    sudo-1.9.17p2.pkg

Desactivar el repositorio oficial (opcional)

#
# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#

FreeBSD: {
 url: "pkg+https://pkg.FreeBSD.org/${ABI}/quarterly",
# url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest",
 mirror_type: "srv",
 signature_type: "fingerprints",
 fingerprints: "/usr/share/keys/pkg",
 enabled: no
}

Otra opción. La prioridad define el orden en que se utilizan estos repositorios

Por defecto, se utiliza el repositorio upstream de FreeBSD.org. Pero como queremos que nuestros propios paquetes tengan precedencia, le daremos una prioridad más alta que cero para que use nuestro repositorio de paquetes primero.

Quedaría así:

#
# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#

FreeBSD: {
 url: "pkg+https://pkg.FreeBSD.org/${ABI}/quarterly",
# url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest",
 mirror_type: "srv",
 signature_type: "fingerprints",
 fingerprints: "/usr/share/keys/pkg",
 enabled: yes
}

Archivo /usr/local/etc/pkg/repos/poudriere.conf

poudriere {
  url: "http://127.0.0.1/packages/142amd64-default/",
  # url = "file:///usr/local/poudriere/data/packages/142amd64-default",
  enabled = yes,
  priority: 23,
  mirror_type: "http",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/poudriere/poudriere.pub",
}

Veamos en acción

 pkg update
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
Updating poudriere repository catalogue...
Fetching meta.conf: 100%    179 B   0.2kB/s    00:01    
Fetching data.pkg: 100%    2 KiB   2.0kB/s    00:01    
Processing entries: 100%
poudriere repository update completed. 3 packages processed.
All repositories are up to date.
root@solaris:/usr/local/etc/pkg/repos# pkg upgrade
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
Updating poudriere repository catalogue...
poudriere repository is up to date.
All repositories are up to date.
Checking for upgrades (206 candidates): 100%
Processing candidates (206 candidates): 100%
The following 4 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	p5-Crypt-URandom: 0.54 [FreeBSD]

Installed packages to be UPGRADED:
	nss: 3.115 -> 3.115.1 [FreeBSD]
	p5-Authen-SASL: 2.18 -> 2.1900 [FreeBSD]
	perl5: 5.40.2_2 -> 5.40.3_2 [FreeBSD]

Number of packages to be installed: 1
Number of packages to be upgraded: 3

18 MiB to be downloaded.

Proceed with this action? [y/N]: y
[1/4] Fetching nss-3.115.1.pkg: 100%    2 MiB   2.3MB/s    00:01    
[2/4] Fetching p5-Crypt-URandom-0.54.pkg: 100%   17 KiB  17.6kB/s    00:01    
[3/4] Fetching perl5-5.40.3_2.pkg: 100%   16 MiB  16.4MB/s    00:01    
[4/4] Fetching p5-Authen-SASL-2.1900.pkg: 100%   44 KiB  44.7kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/6] Deinstalling p5-Authen-SASL-2.18...
[1/6] Deleting files for p5-Authen-SASL-2.18: 100%
[2/6] Deinstalling perl5-5.40.2_2...
[2/6] Deleting files for perl5-5.40.2_2: 100%
[3/6] Upgrading nss from 3.115 to 3.115.1...
[3/6] Extracting nss-3.115.1: 100%
[4/6] Installing perl5-5.40.3_2...
[4/6] Extracting perl5-5.40.3_2: 100%
[5/6] Installing p5-Crypt-URandom-0.54...
[5/6] Extracting p5-Crypt-URandom-0.54: 100%
[6/6] Installing p5-Authen-SASL-2.1900...
[6/6] Extracting p5-Authen-SASL-2.1900: 100%
tree /usr/local/poudriere/data/packages/
/usr/local/poudriere/data/packages/
└── 142amd64-default
    ├── All -> .latest/All
    ├── Latest -> .latest/Latest
    ├── data
    ├── data.pkg -> .latest/data.pkg
    ├── data.tzst -> .latest/data.tzst
    ├── logs -> .latest/logs
    ├── meta -> .latest/meta
    ├── meta.conf -> .latest/meta.conf
    ├── packagesite.pkg -> .latest/packagesite.pkg
    ├── packagesite.tzst -> .latest/packagesite.tzst
    └── packagesite.yaml

5 directories, 8 files

Instalar paquete desde repositorio local

pkg install sudo
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
Updating poudriere repository catalogue...
poudriere repository is up to date.
All repositories are up to date.
Checking integrity... done (0 conflicting)
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	sudo: 1.9.17p2 [poudriere]

Number of packages to be installed: 1

The process will require 2 MiB more space.

Proceed with this action? [y/N]: y
[1/1] Installing sudo-1.9.17p2...
[1/1] Extracting sudo-1.9.17p2: 100%
Comprobar security con INSULTS activado:
sudo vim /etc/rc.conf                 
Password:
Quizás si usaras más de dos dedos...
Password:
¡Este hombre no sabe cuándo está vencido! Tampoco sabe cuándo está ganando. 
No tiene... una especie de... aparato sensorial...
Password:
FreeBSD es genial!.

domingo, 20 de junio de 2010

Permisos de acceso


El papel de un sistema operativo es también el de asegurar la integridad y el acceso a los datos. Esto es posible gracias a un sistema de permisos. A cada fichero o directorio se le asignan unos privilegios que le son propios, así como autorizaciones de acceso individuales. En el momento de intentar el acceso, el sistema comprueba si está autorizado.

Cuando el administrador crea un usuario, le asigna un UID (User Identification) único. Los usuarios quedan definidos en el fichero /etc/passwd. Cada usuario es integrado en, al menos, un grupo, que será su grupo primario. Todos éstos tienen un identificador único, el GID (Group Identification) definidos en el fichero /etc/group.

obtener esta información es posible con el comando id. A nivel interno, el sistema trabaja únicamente con los UID y GID.

gentoo@hypatia ~ $ id
uid=1000(gentoo) gid=100(users) grupos=100(users),18(audio),19(cdrom),27(video),85(usb),250(portage),1002(plugdev)

Se asocian un UID y un GID a cada fichero (inodo) que define su propietario y su grupo con privilegios. Usted asigna permisos al propietario, al grupo con privilegios y al resto de la gente. Se distinguen tres casos:

UID del usuario idéntico al UID definido para el fichero. Este usuario es propietario del fichero.
   
Los UID son diferentes: el sistema comprueba si el GID del usuario es idéntico al GID del fichero. Si es el caso, el usuario pertenece al grupo con privilegios del fichero.

En los otros casos (ninguna correspondencia): se trata del resto de la gente (others), ni es el propietario, ni un miembro del grupo con privilegios.   

drwxr-xr-x 10 gentoo users 4096 jun 13 7:32 tutoriales

En esta línea de la tabla, el directorio tutoriales pertenece al usuario gentoo y grupo users con los permisos rwxr-xr-x.

Fichero normal


r - Se puede leer el contenido, cargarlo en memoria, listarlo y copiarlo.

w - Se puede modificar el contenido del fichero. Se puede escribir dentro. Modificar el contenido no significa poder eliminar el fichero (ver permisos en directorio).

x - Se puede ejecutar el fichero desde la línea de comandos si se trata de un programa binario (compilado) o de un script (shell, perl...).

Directorio

r - Se pueden listar (leer) los elementos del directorio (catálogo). Sin esta autorización, ls y los criterios de filtro en el directorio y su contenido no serían posibles. No obstante, puede seguir accediendo a un fichero si conoce su ruta de acceso.

w - Se pueden modificar los elementos del directorio (catálogo), y es posible crear, volver a nombrar y suprimir ficheros en este directorio. Es este permiso el que controla el permiso de eliminación de un fichero.

x - Se puede acceder al catálogo por CD y se puede listar. Sin esta autorización, es imposible acceder al directorio y actuar en su contenido, que pasa a estar cerrado.

Por ejemplo, para un fichero:

rwxr-xr--

Permisos para el propietario de lectura, escritura y ejecución.
Permiso para los miembros del grupo de lectura y ejecución.
Permisos para el resto del mundo de lectura únicamente.

Modificar permisos

Cuando se crea, un fichero o un directorio dispone de permisos por defecto. El comando chmod (change mode) se utiliza para modificar los permisos en un fichero o un directorio. Existen dos métodos para modificar estos derechos: mediante símbolos o mediante un sistema octal de representación de permisos. Sólo el propietario de un fichero y el administrador del sistema puede modificar sus permisos. El parámetro -R cambia los permisos de manera recursiva.

La sintaxis es la siguiente:

chmod modificaciones file3 file2...

Para modificar los permisos del propietario, utilice el carácter u; para los permisos del grupo con permisos, el carácter g; para el resto, el carácter o, y para todos, el carácter a.

Para añadir permisos, se utiliza el carácter +; para retirarlos, el carácter -, y para no tener en cuenta los parámetros anteriores, el carácter =.

Finalmente, ponga el permiso cuyos símbolos son: r, w o x.

Puede separar las modificaciones con comas y acumular varios permisos en un mismo comando.

Si quiere suprimir todos los derechos, no especifique nada después del signo =:


gentoo@hypatia ~ $ ls -l chapter6-config
-rw-r--rwx 1 gentoo users 3257 jun 12 23:48 chapter6-config

gentoo@hypatia ~ $ chmod o= chapter6-config
gentoo@hypatia ~ $ ls -l chapter6-config
-rw-r----- 1 gentoo users 3257 jun 12 23:48 chapter6-config

Sistema octal

  r =  4
  w = 2
  x = 1

Para obtener el permiso final, basta sumar los valores. Por ejemplo, si quiere rwxrw-rw-, entonces obtiene 400+200+100+40+10+4+1=755, y para rw-r--r-- 400+200+40+4=644.

La modificación octal de los permisos no permite modificar un solo derecho. Es la totalidad de los permisos lo que se ha modificado de una sola vez.

Máscara de permisos


En el momento de la creación de un fichero o de un directorio, se les asigna unos permisos automáticamente. Suele ser rw-r--r-- (644) para un fichero y rwxr-xr-x (755) para un directorio. Una máscara de permisos controla estos valores. Se la puede modificar con el comando umask. El comando umask coge como parámetro un valor octal del cual cada permiso individual será suprimido de los derechos de acceso máximo del fichero o del directorio.

Por defecto, se crean todos los ficheros con los permisos 666 (rw-rw-rw-).
Por defecto, se crean todos los directorios con los permisos 777 (rwxrwxrwx).
Luego se aplica la máscara

La máscara es la misma para el conjunto de los ficheros.Una máscara no modifica los permisos de los ficheros existentes, sino solamente los de los ficheros creados a partir de este momento.

Los permisos por defecto (máximo) de los ficheros y de los directorios no son idénticos. Es lógico: como el permiso x permite entrar en un directorio, es normal que éste disponga de él por defecto. Este mismo permiso es inútil por defecto en los ficheros: sólo una pequeña minoría de los ficheros son scripts o binarios.

La máscara por defecto es 022, o sea ----w--w-. Para obtener este valor, inserte umask sin parámetro.

gentoo@hypatia ~ $ umask
0022

Como calcular la máscara

Para un fichero

Predeterminado  rw-rw-rw- (666)
Retirar         ----w--w- (022)
Resta           rw-r--r-- (644)

Para un directorio


Predeterminado  rwxrwxrwx (777)
Retirar         ----w--w- (022)
Resta           rwxr-xr-x (755)

Observe que aplicar una máscara no es sustraer, sino suprimir permisos de los establecidos por defecto, permiso a permiso. Por ejemplo:

Predeterminado  rw-rw-rw- (666)
Retirar         ----wxrwx (037)
Resta           rw-r----- (640)

Y no 629, lo que es imposible en sistema octal...

Cambiar de propietario y grupo

Es posible cambiar el propietario y el grupo de un fichero con la ayuda de los comandos chown (change owner) y chgrp (change group). El parámetro -R cambia la propiedad de manera recursiva.

chown usuario file1 file3...
chgrp grupo file1 file3...

Al especificar el nombre de usuario (o de grupo), el sistema comprueba primero su existencia. Usted puede especificar un UID o un GID. En este caso, el sistema no efectuará comprobación alguna.

Para los dos comandos, no se modifican los permisos anteriores ni la ubicación del fichero. Es posible modificar con un solo comando el propietario y el grupo a la vez.

chown usuario:grupo file1 file2...
chown usuario.grupo file1 file2...

Sólo root tiene el permiso de cambiar el propietario de un fichero. Pero un usuario puede cambiar el grupo de un fichero si forma parte del nuevo grupo.

gentoo@hypatia ~ $ chgrp video file1
gentoo@hypatia ~ $ ls -l file1
-rwxr-xr-x 1 gentoo video 0 mar 21 22:03 file1

SUID y SGID

Es posible establecer permisos de acceso especiales para ficheros ejecutables. Estos permisos de acceso extendidos aplicados a un comando permiten sustituir los permisos otrogados al usuario que lo inició por los permisos del propietario o del grupo de pertenencia del comando.

El ejemplo más sencillo es el programa passwd, que permite cambiar la contraseña. Si se ejecutara el comando con los permisos de un usuario clásico, passwd no podría abrir y modificar los ficheros /etc/passwd y /etc/shadow:

gentoo@hypatia ~ $ ls -l /etc/passwd
-rw-r--r-- 1 root root 1440 may 24 10:02 /etc/passwd

Puede observar que este fichero pertenece a root, y que sólo root puede escribir en él. Un usuario normal no puede leer su contenido sin interactuar. El comando passwd no debería, por lo tanto, poder modificar los ficheros. Vea los permisos del comando passwd (/bin/passwd o /usr/bin/passwd):

gentoo@hypatia ~ $ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root shadow 78208 jun 10:06 /usr/bin/passwd

Lleva asociado un nuevo permiso: s para los permisos del usuario root. Este nuevo atributo permite la ejecución del comando con permisos de acceso extendidos. Durante el tratamiento, se ejecuta el programa con los permisos del propietario del fichero o de su grupo de pertenencia. En el caso de passwd, se inicia con los permisos de root y no del usuario que lo lanzó.

El permiso s sobre el usuario se llama SUID-Bit (Set User ID Bit), y sobre el grupo, GUID-Bit (Set Group ID Bit).

El comando chmod permite ubicar SUID-Bit y GUID-Bit.

chmod u+s comando
chmod g+s comando

Los valores octales son 4000 para SUID-Bit y 2000 para GUID-Bit.

chmod 4755 comando
chmod 2755 comando

Sólo el propietario o el administrador puede activar esta propiedad. Posicionar SUID-bit o SGID-Bit tiene sentido únicamente si se han establecido los permisos de ejecución previamente (atributo x en el propietario o el grupo). Si éstos no están presentes; se sustituye la s por una S..

No se transmiten los SUID-Bit y SGID-bit a los hijos de un proceso. En este caso, se ejecutarán los hijos con los permisos del usuario que inició el comando básico, los UID reales.

Sticky bit

El sticky bit (bit pegajoso) permite asignar un criterio protector contra el borrado del contenido de un directorio. Imagine un directorio /tmp donde todos los usuarios tienen el permiso de leer y escribir ficheros.

gentoo@hypatia ~ $ ls -ld /tmp
drwxrwxrwx   6 root     system     16384 may 14 13:22 tmp

En este directorio todo el mundo puede suprimir ficheros, incluyendo los que no le pertenecen (derecho w presente en todas partes y para todos). Si el usuario gentoo crea un fichero, el usuario axel puede suprimirlo incluso aunque no le pertenezca.

El sticky bit aplicado a un directorio, impide esta operación.

gentoo@hypatia ~ $ chmod u+t /tmp
gentoo@hypatia ~ $ ls -ld /tmp
drwxrwxrwt 35 root root 77824 jun 21 12:30 /tmp

En octal, se utilizará el valor 1000 (chmod 1777 /tmp).

Aunque aplicado al usuario, el sticky bit, representado por una t, aparece en el grupo de permisos de others.

Permisos y directorio

Si usted da el permiso al grupo en un directorio, todos los ficheros creados dentro de este directorio serán del mismo grupo que este directorio, sea cual sea el grupo de la persona que crea este fichero.

gentoo@hypatia ~ $ mkdir dir
gentoo@hypatia ~ $ chmod 770 dir
gentoo@hypatia ~ $ ls -ld dir
drwxrwx--- 2 gentoo users 4096 jun 21 13:36 dir
gentoo@hypatia ~ $ chgrp video dir
gentoo@hypatia ~ $ chmod g+s dir
gentoo@hypatia ~ $ ls -ld dir
drwxrws--- 2 gentoo video 4096 jun 21 13:37 dir
gentoo@hypatia ~ $ cd dir
gentoo@hypatia ~ $ touch test
gentoo@hypatia ~ $ ls -l test
-rw-r--r-- 1 gentoo video 0 jun 21 13:37 test

Algunos ejercicios:

Supongamos un fichero del que es propietario llamado notas, ha retirado a los miembros del grupo y otros todos los permisos sobre él, y el directorio que lo contiene dispone del permiso w para los miembros del grupo. ¿Quién puede suprimir su fichero?

Usted y los miembros del grupo del directorio. El permiso de escritura en el directorio es el que autoriza a las personas a modificar su contenido.

Con chmod, ¿cuáles son los parámetros que se deben colocar para suprimir los permisos de escritura a los demás, dar el permiso de lectura y ejecución a los miembros del grupo y todos los permisos a usted?

u=rwx,g=rw,o-w.
Quiere crear un directorio donde todo el mundo pueda escribir ficheros, donde todos los ficheros tengan el mismo grupo, pero donde nadie pueda suprimir los ficheros de los demás. ¿Cuáles deben ser los derechos?

rwxrwsrwt, o sea, 3777 en octal.

Linux es genial

domingo, 14 de febrero de 2010

Archivos SUID, SGID y de escritura universal

Probado en Gentoo Linux.

Los archivos con SUID sirven para ejecutar procesos con privilegios de administrador.

Buscar con el comando find los SUID:
# find / -type f -perm - 4000 -ls

337278   56 -rws--x--x   1 root     root        52320 feb 12 07:34 /bin/umount
301984   32 -rws--x--x   1 root     root        32552 ene 16 01:14 /bin/su
337101   76 -rws--x--x   1 root     root        73720 feb 12 07:34 /bin/mount
302015   40 -rws--x--x   1 root     root        38496 ene 16 01:14 /bin/passwd
302023   36 -rws--x--x   1 root     root        35544 ene 15 23:56 /bin/ping
826703   12 -rws--x--x   1 root     root         9548 feb 12 08:51 /usr/lib32/misc/glibc/pt_chown
604307   56 -rws--x--x   1 root     root        51104 ene 16 01:14 /usr/bin/gpasswd
604508   32 -rws--x--x   1 root     root        32200 ene 16 01:14 /usr/bin/newgrp
605877   64 -rws--x--x   1 root     root        58816 ene 16 01:14 /usr/bin/chage
605431   36 -rws--x--x   1 root     root        32800 ene 16 01:14 /usr/bin/chsh
721339   20 -rws--x--x   1 root     root        18776 ene 15 23:56 /usr/sbin/traceroute
604705   44 -rws--x--x   1 root     root        41632 ene 16 01:14 /usr/bin/chfn
....

Los usuarios normales no deberían tener acceso a los archivos de configuración o contraseñas. Por motivos de seguridad es importante que los permisos de ficheros sean correctos. Si está seguro que un archivo sólo es usado por root, asígnele los permisos 0600 y el usuario correcto al fichero con chown.

Los chicos de Gentoo linux nos recomiendan desactivar el bit SUID en ping, mount, umount, chfn, chsh, newgrp, suidperl, pt_chown y traceroute usando chmod -s en cada fichero.

# chmod -s /usr/sbin/traceroute
# chmod -s /bin/mount
# chmod -s /bin/umount
...

Localizar los archivos SGID:

# find / type f -perm -2000 -ls

Consulte lal página man, la documentación de usuario y los HowTo si el autor o cualquier otro experto recomiendan la eliminación del bit SUID/SGID del programa en cuestión.

Archivos de escritura universal
Los archivos reservados no deben configurarse como de escritura universal impidiendo así la modificación del archivo a cualquier usuario. Entre los más comunes se encuentran los archivos de iniciación del sistema, archivos críticos de configuración del sistema y de arranque del usuario.

Buscar archivos de escritura universal:
# find / -perm -2 -type f -print
/usr/bin/xine

Cambiamos los permisos de /usr/bin/xine
# chmod 555 /usr/bin/xine

Ejecutamos nuevamente find / -perm -2 -type f -print:
# find / -perm -2 -type f -print

El resultado es cero archivos de escritura universal.
¡Feliz San Valentín!.

Sientase libre de hacer cualquier comentario que complemente, aclare o corrija el texto anterior.