Permisos de Archivos y Usuarios en Linux, y en especial para Desarrollo Web
Linux administra los permisos de archivos y carpetas mediante un sistema de lectura (r
), escritura (w
) y ejecución (x
). Estos permisos pueden asignarse a usuarios, grupos y otros.
Entendiendo los Permisos
Cada archivo o directorio tiene tres tipos de permisos:
- Lectura (
r
): Permite ver el contenido de un archivo o listar archivos dentro de un directorio. - Escritura (
w
): Permite modificar un archivo o añadir/eliminar archivos en un directorio. - Ejecución (
x
): Permite ejecutar un archivo como programa o acceder a un directorio.
Los permisos se aplican a tres categorías:
- Usuario (
u
): El propietario del archivo. - Grupo (
g
): Un grupo de usuarios con acceso. - Otros (
o
): Cualquier usuario en el sistema que no sea el propietario ni miembro del grupo.
Para ver los permisos de un archivo o directorio, usa:
ls -l archivo.txt
El resultado se verá algo así: -rwxr-xr--
. El primer carácter indica el tipo (-
para archivo, d
para directorio). Los siguientes nueve caracteres representan los permisos (tres para usuario, tres para grupo, tres para otros).
Modificación de Permisos usando Notación Numérica (Octal)
Cada permiso (r
, w
, x
) tiene un valor numérico:
r
= 4w
= 2x
= 1-
= 0 (sin permiso)
Suma los valores para cada categoría (usuario, grupo, otros) para obtener un número de tres dígitos:
7
= rwx (4+2+1)6
= rw- (4+2+0)5
= r-x (4+0+1)4
= r-- (4+0+0)0
= --- (0+0+0)
Ejemplo: chmod 755 archivo.sh
- 7 (rwx) para el usuario propietario.
- 5 (r-x) para el grupo.
- 5 (r-x) para otros.
chmod [permisos_octal] [nombre_archivo_o_directorio]
Usando Notación Simbólica
Puedes añadir (+
), quitar (-
) o establecer (=
) permisos para categorías específicas.
chmod u+x script.sh
Agrega permiso de ejecución en script.sh al propietario.chmod g-w archivo.txt
Quita permiso de escritura al grupo.- puedes usar
u
(user),g
(grupo)o
(otros) ya
(todos). - o puedes agrupar las órdenes:
chmod u+x,g-w,o+r archivo.txt
chmod [ugoa][+-=][rwx] [nombre_archivo_o_directorio]
Cambio de Propietario y Grupo
El comando chown
cambia el propietario de un archivo o directorio. El comando chgrp
cambia solo el grupo.
sudo chown [nuevo_propietario] [archivo/directorio]
sudo chown [nuevo_propietario]:[nuevo_grupo] [archivo/directorio]
sudo chgrp [nuevo_grupo] [archivo/directorio]
Para aplicar los cambios de forma recursiva (a subdirectorios y archivos), usa la opción -R
:
sudo chown -R [nuevo_propietario]:[nuevo_grupo] [directorio]
La Peligrosidad de chmod 777
Dar permisos 777
(lectura, escritura y ejecución para todos) a un archivo o directorio es una práctica extremadamente peligrosa. Significa que cualquier usuario o proceso en el sistema (incluyendo posibles atacantes que exploten vulnerabilidades en el servidor web) puede leer, modificar y ejecutar ese archivo. Esto abre la puerta a la inyección de código malicioso, la eliminación de datos y a graves agujeros de seguridad. Siempre busca el mínimo permiso necesario.
Permisos en Linux para Desarrollo Web
Configurar correctamente los permisos en el directorio de tu proyecto web (ej. /var/www/tu-proyecto/
) es crucial para la seguridad y el funcionamiento del servidor web (Apache, Nginx). El servidor web generalmente se ejecuta bajo el usuario y grupo www-data
en sistemas basados en Debian/Ubuntu.
1. Establecer Propietario y Grupo Base
Primero, asegúrate de que tú eres el propietario de los archivos para poder modificarlos fácilmente, y que el grupo sea www-data
para que el servidor web pueda acceder a ellos. Aplica esto recursivamente a todo tu proyecto:
sudo chown -R tu-usuario:www-data /var/www/tu-proyecto/
Reemplaza tu-usuario
con tu nombre de usuario de Linux.
2. Permisos Específicos para Directorios y Archivos
Es una buena práctica diferenciar los permisos para directorios y archivos. Los directorios necesitan el bit de ejecución (`x`) para poder "navegar" en ellos, mientras que los archivos rara vez lo necesitan. Los archivos PHP son ejecutados por el intérprete PHP, no directamente como binarios del sistema, por lo que el bit `x` no es estrictamente necesario en ellos.
Para Directorios (ej. 775
o 755
):
- `775`: Propietario (tu-usuario) `rwx`, Grupo (www-data) `rwx`, Otros `r-x`. Permite que tu usuario y el servidor web (si necesita escribir, ej. en cachés o uploads) tengan control total, y otros solo lectura y ejecución.
- `755`: Propietario (tu-usuario) `rwx`, Grupo (www-data) `r-x`, Otros `r-x`. Más restrictivo para el grupo (www-data) y otros, solo lectura/ejecución. El servidor solo podrá escribir en directorios o archivos específicos a los que se le dé permiso de escritura.
Para Archivos (ej. 664
o 644
):
- `664`: Propietario (tu-usuario) `rw-`, Grupo (www-data) `rw-`, Otros `r--`. Permite a tu usuario y al servidor web (si necesita escribir, ej. logs) leer y escribir. Otros solo lectura.
- `644`: Propietario (tu-usuario) `rw-`, Grupo (www-data) `r--`, Otros `r--`. Más seguro para archivos estáticos (HTML, CSS, JS, imágenes) y archivos PHP que solo necesitan ser leídos por el servidor. Tu usuario puede escribir, el servidor solo leer.
Puedes aplicar estos permisos de forma granular usando find
:
# Para directorios: 775 (si el servidor necesita escribir en directorios de caché/uploads)
sudo find /var/www/tu-proyecto/ -type d -exec chmod 775 {} \;
# Para archivos: 644 (lectura para el servidor, escritura para tu usuario)
sudo find /var/www/tu-proyecto/ -type f -exec chmod 644 {} \;
# O si necesitas que el grupo www-data pueda escribir en ciertos archivos (ej. logs):
# sudo find /var/www/tu-proyecto/ -type f -exec chmod 664 {} \;
Generalmente, un archivo PHP no necesita permisos de ejecución. Cuando un navegador solicita un archivo .php
, el servidor web (Apache, Nginx) pasa ese archivo al intérprete de PHP (un programa binario como /usr/bin/php
). Es el intérprete de PHP el que tiene los permisos de ejecución y procesa el código. El archivo .php
en sí mismo solo necesita permiso de lectura (`r`) por parte del usuario www-data
.
3. Automatización y Consistencia de Permisos: Bit SGID (Set Group ID) para Directorios
Para garantizar que cualquier nuevo archivo o directorio creado dentro de /var/www/tu-proyecto/
herede automáticamente el grupo www-data
, establece el bit SGID en el directorio principal:
sudo chmod g+s /var/www/tu-proyecto/
Esto es muy útil cuando varios usuarios o procesos (incluido el servidor web) crean archivos, asegurando que todos pertenezcan al grupo correcto y mantengan los permisos adecuados.
4. Configurar umask
(Máscara de Creación de Archivos)
umask
es un valor que controla los permisos predeterminados que tendrán los nuevos archivos y directorios que creas. Funciona restando su valor de los permisos base (666
para archivos y 777
para directorios).
Establecer un umask
adecuado en tu archivo de configuración de shell (ej. ~/.bashrc
para tu usuario) puede simplificar la gestión de permisos al crear nuevos archivos. Por ejemplo, un umask 002
significa:
- Archivos nuevos: Tendrán permisos
664
(rw-rw-r--
). (Calculo:666
-002
=664
) - Directorios nuevos: Tendrán permisos
775
(rwxrwxr-x
). (Calculo:777
-002
=775
)
Esto es beneficioso para el desarrollo web porque asegura que los archivos y directorios que crees por defecto darán permisos de lectura/escritura al grupo (www-data
si has configurado el SGID bit y el grupo de tu proyecto), sin tener que modificar manualmente los permisos cada vez.
Importante: Impacto de umask
: Ten en cuenta que el umask
configurado en ~/.bashrc
afecta a todos los archivos y directorios que tu usuario cree en cualquier parte del sistema, no solo dentro de tus proyectos web. Si esta amplitud es una preocupación de seguridad en tu entorno, considera opciones más granulares como las ACLs (setfacl
) para la herencia de permisos dentro de directorios específicos, que ofrecen un control más localizado.
Para aplicar el umask
, añade la siguiente línea a tu ~/.bashrc
:
umask 002
Después de añadir esta línea, guarda el archivo y recarga tu configuración de shell:
source ~/.bashrc
En tu archivo de configuración de shell (ej. ~/.bashrc
para tu usuario):
Después de añadir esta línea, guarda el archivo y recarga tu configuración de shell:
source ~/.bashrc
5. Ajustes Manuales para Archivos Específicos (Logs, Uploads)
Algunos directorios o archivos específicos, como los directorios de subida de archivos o los archivos de log, o de cache, necesitan que el servidor web (`www-data`) tenga permisos de escritura.
Ejemplo para un archivo de log:
sudo chown tu-usuario:www-data /var/www/tu-proyecto/logs/error.log
sudo chmod 664 /var/www/tu-proyecto/logs/error.log
Ejemplo para un directorio de subida de archivos (donde el servidor necesita escribir nuevos archivos):
sudo chmod 775 /var/www/tu-proyecto/uploads/
6. Alias o Función para Reaplicar Permisos
Es muy útil tener un comando rápido para reaplicar todos los permisos si algo se corrompe o después de un despliegue.
Puedes añadir la siguiente función a tu ~/.bashrc
para una gestión más robusta (preferible a un alias para comandos multilínea):
# Función para inicializar permisos del proyecto web
function permproyect() {
echo "Configurando permisos para /var/www/$1/..."
sudo chown -R $USER:www-data /var/www/$1/
sudo find /var/www/$1/ -type d -exec chmod 775 {} \;
sudo find /var/www/$1/ -type f -exec chmod 644 {} \;
sudo chmod g+s /var/www/$1/
# Ejemplo: Asegurar permisos de escritura para logs
if [ -d "/var/www/$1/logs" ]; then
sudo chmod 664 /var/www/$1/logs/*.log 2>/dev/null
echo " - Permisos de logs ajustados."
fi
# Ejemplo: Asegurar permisos de escritura para uploads
if [ -d "/var/www/$1/uploads" ]; then
sudo chmod 775 /var/www/$1/uploads/
echo " - Permisos de uploads ajustados."
fi
echo "Permisos configurados para /var/www/$1/."
}
# Uso: permproyect tu-proyecto
# Recuerda que debes ejecutar 'source ~/.bashrc' después de añadir esta función.
Con esta función, simplemente ejecutarías permproyect tu-proyecto
y se aplicarían todos los permisos definidos.
Consideraciones sobre Scripts de Administración
Es importante diferenciar los scripts PHP que son parte de tu aplicación web (que el servidor web sirve) de los scripts de administración que se ejecutan directamente en la línea de comandos (CLI) o vía tareas programadas (cron jobs).
- Scripts PHP de la aplicación (en
/var/www/tu-proyecto/public/
):- Necesitan permisos de lectura (`r`) para el usuario `www-data`.
- No necesitan el bit de ejecución (`x`), ya que son procesados por el intérprete de PHP.
- Ejemplo:
644
.
- Scripts de Administración (CLI, Cron Jobs):
- Estos scripts (PHP, Bash, Python, etc.) se ejecutan directamente como programas.
- Necesitan el bit de ejecución (`x`) para el usuario que los ejecuta.
- ¡NO DEBEN ESTAR EN EL DIRECTORIO ACCESIBLE PÚBLICAMENTE (
www
)! Guárdalos en un directorio fuera del alcance del servidor web (ej./var/www/tu-proyecto/cli-scripts/
o~/scripts/
). - Ejemplo:
755
(para el usuario que los ejecuta).
Consideraciones Específicas para Hosting Compartido
Las recomendaciones anteriores asumen que tienes control total sobre tu servidor (como en un VPS o servidor dedicado). En un entorno de hosting compartido, las capacidades para gestionar permisos suelen ser más limitadas, y las configuraciones son establecidas por tu proveedor.
- Acceso Restringido: Generalmente no tendrás acceso a
sudo
,chown
, ochgrp
. El propietario de los archivos y el grupo bajo el que se ejecuta el servidor web son gestionados por el proveedor. - Usuario del Servidor Web: El servidor web (Apache, Nginx) operará bajo un usuario y grupo específicos del proveedor y accederá a tus archivos a través de los permisos de "grupo" u "otros" que les asignes.
- Herramientas de Gestión: Modificarás los permisos principalmente a través de:
- Cliente FTP/SFTP: (Ej. FileZilla) clic derecho > Permisos de archivo.
- Panel de Control del Hosting: (Ej. cPanel, Plesk) Administrador de Archivos.
- Acceso SSH (si disponible): Puedes usar
chmod
yfind
, pero **sinsudo
nichown
**.
- ACLs y SGID: Las funciones avanzadas como las ACLs o el bit SGID para herencia de grupo **no suelen estar disponibles ni ser configurables** por el usuario en hosting compartido.
Permisos Típicos y Seguros en Hosting Compartido:
De acuerdo con las recomendaciones generales de la industria y proveedores como DreamHost, los permisos más comunes y seguros en entornos de hosting compartido son:
- Archivos (HTML, CSS, JS, Imágenes, PHP):
644
(Propietario: rw-, Grupo: r--, Otros: r--).- Tu usuario puede leer y escribir.
- El servidor web y otros usuarios pueden leer.
- Directorios:
755
(Propietario: rwx, Grupo: r-x, Otros: r-x).- Tu usuario puede leer, escribir y navegar.
- El servidor web y otros usuarios pueden leer y navegar.
- Ejecutables (scripts CLI/Bash que no son parte de la aplicación web):
755
.- Aplicable a scripts destinados a ser ejecutados directamente, no archivos PHP que el servidor interpreta.
- Recuerda: Estos ejecutables no deben estar en directorios accesibles públicamente.
- Archivos de Configuración Sensibles (ej.
wp-config.php
):640
o600
.600
es el más restrictivo (solo el propietario puede leer y escribir).
- Directorios que necesitan escritura por el servidor (uploads, cache, logs):
- Generalmente, intenta con
755
. Si el servidor web (o tu aplicación) necesita escribir en ellos y no funciona, algunos proveedores pueden requerir775
. - ¡Evita
777
siempre! Si tu proveedor insiste en777
, considera las implicaciones de seguridad o busca una alternativa, ya que es un riesgo grave.
- Generalmente, intenta con
Nota: Recomendación Fundamental para Hosting Compartido:
Siempre consulta la documentación específica de tu proveedor de hosting. Ellos te darán las directrices de permisos más adecuadas para su entorno particular, ya que pueden variar ligeramente según su configuración de seguridad (ej. si utilizan suPHP, FastCGI, etc., que pueden hacer que los scripts PHP se ejecuten bajo tu propio usuario).
Herencia de Permisos Avanzada con ACLs (Access Control Lists)
Las ACLs son una solución muy robusta para la herencia de permisos. Superan las limitaciones de umask
al permitir especificar herencia de permisos para usuarios y grupos específicos dentro de un directorio particular, sin afectar el resto del sistema. No obstante, para utilizar ACLs, es preciso que tu sistema de archivos (ej. Ext4) esté montado con la opción acl
. En algunos casos, esto puede requerir la instalación del paquete acl
y la modificación del archivo /etc/fstab
. Estos pasos de configuración del sistema de archivos quedan fuera del alcance de este manual para mantener la simplicidad y el enfoque en la gestión de permisos a nivel de usuario y proyecto.
Solución de Problemas Comunes
- "Forbidden" (403 Error): A menudo indica permisos de lectura o ejecución incorrectos en directorios o archivos. Asegúrate de que el usuario
www-data
tenga permisos de lectura (`r`) y, para directorios, de ejecución (`x`). - "Internal Server Error" (500 Error): Puede ser un error de sintaxis en el código PHP, pero también podría ser un problema de permisos si el servidor no puede leer el archivo PHP o escribir en un archivo de log.
- Archivos subidos no accesibles: Si los archivos subidos por los usuarios no son visibles o no se pueden procesar, revisa que el directorio de subidas tenga permisos de escritura (`w`) para el usuario `www-data` (ej. `775`) y que los archivos creados hereden el grupo correcto (usa `g+s` y `umask`).