Alojamiento de espacio personal

Los usuarios tendrán disponible un espacio personal en el que alojar su propia página web.

Configuración de Apache

Para lograr esto haremos uso del módulo userdir de apache. En primer lugar instalamos el módulo, lo que se hace con la orden.

# a2enmod userdir

Tras esto podemos ver que aparece en la carpeta de módulos activos.

# ls /etc/apache2/mods-enabled | grep userdir
 userdir.conf
 userdir.load

Analizaremos el contenido del archivo de configuración para adaptarlo a nuestras necesidades. Es el siguiente.

<IfModule mod_php5.c>
    <FilesMatch "\.ph(p3?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>
    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>
    # To re-enable php in user directories comment the following lines
    # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
    # prevents .htaccess files from disabling it.
    <IfModule mod_userdir.c>
        <Directory /home/*/public_html>
            php_admin_value engine Off
        </Directory>
    </IfModule>
</IfModule>


<IfModule mod_userdir.c>
        UserDir public_html
        UserDir disabled root

        <Directory /home/*/public_html>
                AllowOverride FileInfo AuthConfig Limit Indexes
                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
                <Limit GET POST OPTIONS>
                        Order allow,deny
                        Allow from all
                </Limit>
                <LimitExcept GET POST OPTIONS>
                        Order deny,allow
                        Deny from all
                </LimitExcept>
        </Directory>
</IfModule>

Se indica que la carpeta en la que se tendrá el espacio personal es public_html, lo que indica que esta será /home/$usuario/public_html. Posteriormente selecionaremos la carpeta que nos sea más conveniente.

También se especifica que no se tendrá página personal para el usuario root.

En el resto de lineas se indica la configuración y permisos que se desean.

Tras esto comprobamos que está desactivada la posibilidad de utilizar php en las páginas personales, ya que podría acarrear problemas de seguridad y no deseamos brindarle a nuestros usuarios esa funcionalidad.

Para ello editaremos la configuración del módulo de php que se encuentra dentro de la misma carpeta en el archivo php5.conf. Dejaremos esta opción en el valor Off.

<IfModule mod_php5.c>
    <FilesMatch "\.ph(p3?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>
    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>
    # To re-enable php in user directories comment the following lines
    # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
    # prevents .htaccess files from disabling it.
    <IfModule mod_userdir.c>
        <Directory /home/*/public_html>
            php_admin_value engine Off
        </Directory>
    </IfModule>
</IfModule>

Hecho todo lo anterior solo queda reiniciar apache para tener disponibles las páginas de usuario.

# /etc/init.d/apache2 restart

Acceso por sftp

Ahora necesitamos que el usuario tenga acceso por ftp a su espacio pero no queremos que pueda acceder al resto del sistema, esto lo conseguiremos mediante el mecanismo de chroot.

Comenzaremos por editar el archivo /etc/ssh/sshd_config que corresponde a la confiuración de sshd (que incluye sftp) del modo siguiente.

Comentaremos la linea siguiente.

#Subsystem sftp /usr/lib/openssh/sftp-server

Y en su lugar añadiremos lo siguiente.

Subsystem sftp internal-sftp
Match   Group ftp-users
        ChrootDirectory /home/%u/web
        ForceCommand internal-sftp
        PasswordAuthentication yes

En la primera de ellas se indica que se desa utilizar el sftp interno del servidor sshd. Además se crea una regla para los usuarios del grupo ftp-users. A este grupo pertenecerán los usuarios que deseamos que accedan por sftp a sus espacios personales.

Para esta regla se tiene un directorio ‘enjaulado’ o chroot en la carpeta /home/$usuario/web. Utilizamos este directorio en lugar del indicado anteriormente dado que la jaula no puede tener permisos de escritura y no queremos que el usuario pueda ver el contenido de su directorio home. Esto se debe a que hay otros archivos en su carpeta que no queremos que vea, por ejemplo, los relativos al email.

Realizado lo anterior los usuarios del grupo ftp-users tendrán acceso por sftp únicamente a su jaula. Pero el resto de usuarios tendrán acceso libre al sistema. Para evitar esto indicamos que sólo tendrán acceso los usuarios de los grupos sftp-users y root, además de nuestros usuarios particulares.

AllowGroups root ftp-users rufian

Con lo anterior solo queda establecer los permisos para las carpetas creadas.

El directorio web dentro de la carpeta de usuario tendrá los permisos 751 y pertenecerá al usuario root y grupo ftp-users.

Aquí es donde nuestro usuarios accedera al conectarse por sftp. Los archivos de este directorio podrán ser leídos ya que el usuario pertenece al grupo perteneciente de la carpeta, pero no podrá escribir. Esta carpeta únicamente se utilizará para tener archivos fijos que informarán al usuario del funcionamiento de su espacio personal y le indicarán las reglas del sitio.

Dentro de este directorio crearemos, ahora sí, nuestra carpeta public_html. En esta carpeta el usuario podrá subir sus archivos por tanto le establecemos como propietaroi de la carpeta y le damos los permisos 755 para que cualquiera pueda acceder a su página web, en concreto el servidor apache.

# ~hormigon/web/public_html/ ls -la
drwxr-xr-x 2 hormigon ftp-users 4096 May 23 00:56 .
drwxr-x--x 3 root     ftp-users 4096 May 23 00:56 ..

El acceso por ftp ya será posible, lo podemos comprobar con el cliente FileZilla.

../_images/filezilla.png

Vemos que sólo es posible acceder a las carpetas deseadas.

Elegir la dirección

Ahora las páginas personales estarán en un directorio diferente al que elegimos en un principio. Eso lo solucionamos mediante la configuración de apache, en concreto editamos el archivo /etc/apache2/sites-config/main.

Añadiremos la linea siguiente, que hará que las peticiones a la direcicón cactus.rufian.eu/web/$usuario nos lleven al contenido de la carpeta ~/web/public_html.

AliasMatch ^/web/([a-zA-Z0-9]+)/?(.*) /home/$1/web/public_html/$2

Tras reiniciar de nuevo apache comprobamos que es posible acceder mediante esa dirección.

../_images/newurl.png

Activar/Desactivar el servicio

Se desea que sea posible activar o desactivar el servicio desde la página web de Cactus. Para conseguir esto creamos un nuevo módulo perl de Cactus en el que se definen las subrutinas para crear y eliminar la página web.

Para crearla se hará lo siguiente.:

sub create_web($)
{
    my ($user) = @_;

    my $pu = Passwd::Unix->new();

    if (! $pu->user($user) ) {

        Cactus::Utils::servicelog("Create Web", $user, "Invalid username");
        return 402;
    }

    unless(-d "/home/$user/web/public_html")
    {
        make_path("/home/$user/web/public_html");
    }

    my $rootuid = getpwnam("root");
    my $ftpgroupguid = getgrnam("ftp-users");
    my $useruid = getpwnam($user);

    chown($rootuid, $ftpgroupguid, "/home/$user/web");
    chmod 0751, "/home/$user";
    chmod 0751, "/home/$user/web";
    chown($useruid, $ftpgroupguid, "/home/$user/web/public_html");
    chmod 0755, "/home/$user/web/public_html";

    put_welcome_html($user);
    put_readme($user);

    my $grp = new Unix::GroupFile "/etc/group";
    $grp->add_user($ftpgroup, $user);
    $grp->commit();
    Cactus::Utils::servicelog("Create Web", $user, "OK");
    return 200;

}

En primer lugar se comprueba que existe el usuario como en ocasiones anterior y después se crea el directorio web/public_html en la carpeta del usuario si no existiera.

A este directorio se le deben dar los permisos oportunos (explicados antes).

Adicionalmente, incluimos en los directorios creados una página de bienvenida como la que se mostró en el ejemplo anterior y un archivo readme en el que se explica qué se debe hacer.

Finalmente, se añade el usuario al grupo sftp-users que le da la posibilidad de conectarse por sftp.

Incluimos aquí las subrutinas para crear los archivos.

sub put_welcome_html($)
{
    my ($user) = @_;

    open FILE, ">", "/home/$user/web/public_html/index.html";
    print FILE "<html>";
    print FILE "<head></head>";
    print FILE "<body>";
    print FILE "<h1>Espacio personal de $user</h1>";
    print FILE "<p>$user no ha escrito nada en su espacio personal.</p>";
    print FILE "</body>";;
    print FILE "</html>";;
    close FILE;
    my $useruid = getpwnam($user);

    chown($useruid, $useruid, "/home/$user/web/public_html/index.html");
    chmod 0755, "/home/$user/web/public_html/index.html";

}

Hay que tener cuidado y dar los permisos adecuados al archivo index.html para que el usuario pueda escribir en él. ¡Si no no podrá sustituirlo por el suyo!

El (breve) archivo readme es el siguiente, pues no somos muy exigentes con las reglas del sitio.

sub put_readme($)
{
    my ($user) = @_;

    open FILE2, ">", "/home/$user/web/LEEME.txt";
    print FILE2 "Bienvenido a tu espacio personal en Cactus\n\n";
    print FILE2 "Coloca tu página web en la carpeta public_html y disfruta de tu web.";
    close FILE2;
    chmod 0755, "/home/$user/web/LEEME.txt";
}

Para eliminar la página personal se tiene la siguiente subrutina.

sub delete_web($)
{
    my ($user) = @_;

    my $pu = Passwd::Unix->new();


    if (! $pu->user($user) ) {
        Cactus::Utils::servicelog("Remove Web", $user, "Invalid username");
        return 402;
    }

    if(-d "/home/$user/web/public_html")
    {
        rmtree("/home/$user/web/public_html")
    }

    my $grp = new Unix::GroupFile "/etc/group";
    $grp->remove_user($ftpgroup, $user);
    $grp->commit();
    Cactus::Utils::servicelog("Remove Web", $user, "OK");
    return 200;
}

Como vemos sigue el funcionamiento habitual. En este caso lo que se hace es eliminar su carpeta public_html y sacarle del grupo de sftp-users, por lo que ya no tendrá acceso mediante sftp a su directorio de la web.

Haciendo uso de estas funciones el servidor web mostará al usuario la posibilidad de crear una web cuando no la tenga.

En el menú de inicio aparece esta posibilidad.

../_images/create.png

Al pulsarla nos dará información sobre la página y la posibilidad de crearla.

../_images/recreate.png

Una vez que aceptamos se nos muestra la información, de la página, la forma de acceder y el porcentaje de uso.

../_images/created.png

El porcentaje de uso se muestra gracias a las rutinas de tronco definidas tras crear los usuarios y asignarles las cuotas correspondientes.

Ahora que tenemos página web esta información también se muestra en la página principal.

../_images/recreated.png

Aprovechamos

Si elegimos la opción de eliminar perderemos nuestra página personales.

../_images/delete.png

Y, con ella, la posibilidad de conectarnos mediante sftp.

../_images/sinsftp.png

Contenidos

Tema anterior

Cuotas de usuario

Próximo tema

Copias de seguridad

Esta página