# Apuntes Examen DPL (UT1-UT2)
**Índice**
1. [Cambiar nombre de usuario](#id1)
2. [Instalación de Servidores](#id2)
3. [Instalación VPS](#id3)
4. [Instalación PhpMyAdmin](#id4)
5. [Instalación HTTPS](#id5)
6. [Instalación FTP](#id6)
## Cambiar nombre de Usuario<a id="id1"></a>
Cambiamos el fichero hostname y hosts en el directorio /etc, y escribimos lo siguiente donde pone el antiguo nombre:
```shell=
# Ficheros hostname
aitor_santana_cabrera
#Fichero hosts
...
127.0.0.1 aitor_santana_cabrera
```
Reiniciar Linux después de aplicar los cambios.
## Instalación de Servidores<a id="id2"></a>
Sistema LAMP -> Linux + Apache + MySql + Php
### Posibles Fallos
En este manual vamos a partir de la base de que tengamos Apache instalado, sin embargo cuando empecemos nos puede surgir un error con las variables de Apache, esto puede ocurrir si hacemos uso del comando $apachectl sin haber configurado bien las variables.
Para solucionarlo podemos usar el comando:
```shell=
$source /etc/apache2/envvars
```
* Abrimos el terminal
```shell=
# Actualizamos el Sistema (¡NO UPGRADE!)
$apt update
# Instalamos Apache
$apt install apache2
```
* Comprobamos el estado del Servidor Apache (LocalHost o 127.0.0.1)
* Activamos el FireWall para máquinas externas
```shell=
#Activamos el FireWall
$ufw enable
#Comprobamos el estado del FireWall
$ufw status
#Muestra las Apps activas en el FireWall
$ufw app list
#Evitamos que nos protega de las peticiones al servidor apache
$ufw allow in "Apache"
```
* Para acceder a mi máquina desde fuera necesitamos la ip pública
```shell=
#Ver configuración de ip
$ip add
#Mostramos la ip publica
$ apt install curl
$curl http://icanhazip.com
```
* Instalamos mysql-server, sin seguridad por ahora (Lo haremos más adelante)
```shell=
# Instalamos Mysql
$apt install mysql-server
#Comprobamos que funciona
$mysql
```
* Instalamos PHP
```shell=
# Instalamos PHP, el módulo de Apache especifico de PHP + MySql
$apt install php libapache2-mod-php php-mysql
```
* Vamos a la raíz del Sistema y vamos al directorio donde Apache guarda las páginas web
```shell=
$cd /
$cd /var/www
```
* Cambiamos la página por defecto del servidor Apache
```shell=
# Entramos en el directorio html
cd /html
# Hacemos una copia de seguridad del index.html
$cp index.html index.copia
# Cambiamos el index.html
```
* Cambiamos la configuracion de apache para que acepte el index.php
```shell=
# Nos movemos al directorio de Apache
$cd /etc/apache2/
#Nos movemos al directorio de modulos de Apache
$cd /mods-enable
# Editamos el fichero dir.conf
$nano dir.conf o $gedit dir.conf
# Añadimos el index.php como primera opción
# Reseteamos el Servicio de Apache
$systemctl reload apache2
```
* Añadimos contenido al index.php
```php=
<?php phpinfo(); ?>
```
* Configuramos MYSQL
```sql=
CREATE DATABASE mydb;
// Creamos el usuario y le seteamos la contraseña
Create USER 'Sstark97'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'password';
// Damos permisos a el usuario creado sobre la base de datos creada previamente
GRANT ALL ON mydb.* to 'Sstark97'@'%';
```
* Entramos con el nuevo usuario en MYSQL
```shell=
$mysql -u Sstark97 -p
```
* Creamos las Tablas del Proyecto de Ejemplo
```sql=
USE mydb;
CREATE TABLE TodoList(
item_id int auto_increment,
contenido varchar(255),
primary key (item_id)
);
INSERT INTO TodoList (contenido) values
("Hacer la comida"),
("Pasear"),
("Estudiar");
SELECT * FROM TodoList;
```
* Cambiamos el index.php
```php=
<?php
$user="Sstark97";
$password="password";
$database="mydb";
$table="TodoList";
try {
$db = new PDO("mysql:host = localhost; dbname=$database",$user,$password);
echo "<h2> Mi lista de cosas por hacer: </h2><ol>";
foreach ($db -> query("SELECT contenido FROM $table") as $row)
{
echo "<li>" . $row["contenido"] . "</li>";
}
echo "</ol>";
} catch (PDOException $e) {
print "Error!".$e -> getMessage(). "<br/>";
die();
}
?>
```
Si da fallo de permisos podemos hacer lo siguiente:
```sql=
-- Para ver los permisos de un usuario concreto.
SHOW GRANTS FOR "Sstark97"@"%";
-- Comprobar que no hay espacios de más.
```
## Instalacion VPS<a id="id3"></a>
- Nos ubicamos en el directorio */var/www* y creamos una carpeta para el nuevo proyecto, y otro directorio interno donde podremos los ficheros del virtual host, el nombre del proyecto sera el del dominio
```shell=
$mkdir proyecto1.son/html -p
$cd proyecto1.son/html
# Hacemos un html
$gedit index.html
```
```htmlembedded=
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Proyecto 1</title>
</head>
<body>
<h1>Proyecto 1</h1>
</body>
</html>
```
- Nos ubicamos en el diectorio */etc/apache2*, no vamos a */sites-available* (deberiamos tener solo el 000.default.conf, que es el proyecto base)
- Creamos un fichero de configuración para nuestro nuevo proyecto (dominio) Lo podemos copiar del anterior
```shell=
$cp 000-default.conf proyecto1.conf
```
- En dicho fichero añadimos lo siguiente:
```shell=
<VirtualHost *:80>
ServerName proyecto1.son
ServerAlias www.proyecto1.son
ServerAdmin webmaster@dominio1.com
DocumentRoot /var/www/proyecto1.son/html
ErrorLog ${APACHE_LOG_DIR}/proyecto1.son-error.log
CustomLog ${APACHE_LOG_DIR}/proyecto1-access.log combined
</VirtualHost>
```
- Habilitamos la configuracion del sitio
```shell=
$a2ensite proyecto1.son.conf
# Si queremos desabilitarlo podemos hacerlo
$a2dissite proyecto1.son.conf
```
- Recargamos apache
```shell=
$systemctl reload apache2
```
- Comprobamos si la configuración esta bien
```shell=
$apachectl configtest
```
- Puede pedirte que añadas como variable global el ServerName 127.0.0.1, para eso vas al directorio /etc/apache2, e incluimos el ServerName 127.0.0.1 en las últimas líneas del fichero
- Reseteamos el servicio
```shell=
$systemctl restart apache2
```
- Por último debemos redireccionar nuestra ip local al nuevo dominio, para eso modificamos el fichero /etc/host, y añadimos lo siguiente:
```shell=
...
127.0.0.1 proyecto1.son
```
- Para ver los fallos
```shell=
$tail -10 /var/log/apache2/...error.log #(Ultimas 10 lineas)
$head -10 ... #(Primeras 10 lineas)
```
## Instalación de PHPMyadmin<a id="id4"></a>
```shell=
$sudo su
$apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl
# apache si, contraseña que queramos
# Nos movemos a la carpeta de Configuración de Apache2
$cd /etc/apache2/
# Añadimos el directorio de phpmyadmin al final del fichero
$gedit apache2.conf
# Escribimos:
# Include /etc/phpmyadmin/apache.conf
# Habilitamos PHP y PHPMyAdmin
$phpenmod mbstring
# Reseteamos el Servidor Apache
$systemctl restart apache2
```
## Instalación HTTPS<a id="id5"></a>
- Desactivamos el Cortafuego
```shell=
$ufw disable
```
- Vamos a ***/etc/apache2/mods-enabled***
- Añadimos el módulo SSL
```shell=
$a2enmod ssl
$systemctl restart apache2
```
- Generamos el certificado SSL firmado por nosotros
```shell=
$openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
<< 'MULTILINE-COMMENT'
Country Name (2 letter code) [XX]:ES
State or Province Name (full name) []:LPA
Locality Name (eg, city) [Default City]:LPA
Organization Name (eg, company) [Default Company Ltd]:aitsancab.sl (tres iniciales nombre y apellido)
Organizational Unit Name (eg, section) []: Section
Common Name (eg, your name or your server's hostname) []:www.proyecto1.son
Email Address []: correo
MULTILINE-COMMENT
```
- Cambiamos la configuracion, archivo proyecto1.son en el directorio ***/etc/apache2/sites-available***
```shell=
$gedit proyecto1.son.conf
# Cambiamos el puerto por el que escucha al 443 (Puerto por defecto de HTTPS)
<VirtualHost *:443>
...
#En el fichero escribimos esto al final del todo
<Directory /var/www/proyecto1.son/html>
Options -Indexes +FollowSymLinks
AllowOverride All
</Directory>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>
```
- Desabilitamos el Proyecto si estaba habilitado:
```shell=
$a2dissite proyecto1.son.conf
$systemctl reload apache2 # o restart
```
- Habilitamos el Proyecto
```shell=
$a2ensite proyecto1.son.conf
$apache2ctl configtest
$systemctl reload apache2
```
Si va todo bien nos debería salir el siguiente mensaje:
```shell=
Output: Syntax OK
```
- En caso de que no funcione abrimos los puertos 443 y 80
```shell=
$ufw allow "Apache Full"
```
- Por último redireccionamos el http al https, para ello vamos a el fichero de configuración en el directorio ***/etc/apache2/sites-available***:
```shell=
# Añadimos un virtualhost para el puerto 80 fuera del que ya tenemos
<VirtualHost *:80>
ServerName proyecto1.son
Redirect / https://proyecto1.son
</VirtualHost>
```
## Instalación de FTP<a id="id6"></a>
### Principales comandos FTP
```shell=
# Enumerar todos los comandos de FTP disponibles.
$help o $?
# Cambia el directorio en la máquina remota.
$cd
# Cambiar el directorio en la máquina local.
$lcd
# Ver los nombres de los archivos y directorios en el directorio remoto actual.
$ls
# Crea un nuevo directorio dentro del directorio remoto.
$mkdir
#I mprime el directorio de trabajo actual en la máquina remota.
$pwd
# Elimina un archivo en el directorio remoto actual.
$delete
# Elimina un directorio en el directorio remoto actual.
$rmdir
# Copia un archivo del servidor remoto a la máquina local.
$get
# Permite copiar múltiples archivos del servidor remoto a la máquina local.
$mget
# Copia un archivo de la máquina local a la máquina remota.
$put
# Copia un archivo de la máquina local a la máquina remota.
$mput
```
#### Consultar que hace un comando
```bash=
$ ? comando
$ help comando
```

### Instalación
```shell=
$apt update
$apt install proftpd
```
Tras la instalación se nos habrán generado una serie de ficheros de configuración, los más importantes:
- ***proftpd.conf***: Configuración de proftpd, se encuentra en el directorio **/etc/proftpd/**
- ***ftpusers***: Fichero que contiene un lista de usuarios que no tienen permiso de acceso por FTP. Por razones de seguridad al menos los siguientes usuarios deberían estar listados en este fichero: root, bin, uucp, news. Ten en cuenta que las líneas en blanco y las líneas que comiencen por el carácter '#' serán ignoradas. Se encuentra en el directorio **/etc**
Para conectarnos al ftp debemos hacerlo de la siguiente forma:
```shell=
# $ftp <direccion_ip>
$ftp localhost
```
Nos pedirá usuario (Por defecto será el nuestro) y contraseña.
#### Configuración básica de proftpd.conf
- **ServerName**: nombre de nuestro servidor.
- **DeferWelcome**: con esto activado, no mostraremos información sobre nuestro equipo hasta que el usuario haga login.
- **ShowSymlinks**: habilita/deshabilita los enlaces simbolicos.
- **TimeoutIdle**: configura la cantidad máxima de segundos que proftpd permitirá a los clientes permanecer conectados sin recibir ningún dato.
- Po****rt: puerto de nuestro servidor (21 por defecto)
- **TransferLog**: especifica la ruta al registro de transferencia.
- **SystemLog**: ruta del fichero en donde guardamos los logs.
#### Mostrar contenido de los logs de proftpd
Vamos a la ruta:
```shell=
$cd /var/log/proftpd
```
Y ejecutamos:
```shell=
$cat proftpd.log
```
#### Modificar mensaje de bienvenida y error
Vamos a la ruta:
```shell=
$cd /etc/proftpd
```
Y ejecutamos:
```shell=
gedit proftpd.conf
```
Al final del fichero coloraremos las siguientes líneas:
```shell=
AccessGrantMsg "Bienvenido a mi servidor"
AccessDenyMsg "ERROR al entrar al servidor"
```
Y reseteamos el ftp:
```shell=
$service proftpd reload
$service proftpd restart
```
#### Directiva DefaultRoot
El parámetro DefaultRoot tiene la siguiente estructura:
```shell=
DefaultRoot [directorio] [grupo de usuarios que tendrán este directorio por defecto] [grupo de usuarios a los que no se les aplicará el directorio]
```
Para poder definir a que carpeta entrarán nuestros usuarios por defecto añadiremos la directiva DeafultRoot a nuestro promftpd:
```shell=
# Por defecto es home
DefaultRoot ~
# Por defecto es /var/ftpXX
DefaultRoot /var/ftpXX
```
#### Crear usuarios y grupos
Para crear un usuarios usaremos:
```shell=
adduser user1dpl
```
Debemos tener en cuenta las diferencias entre adduser y useradd:
- **useradd**: crea un nuevo usuario, pero no le crea su respectiva carpeta en /home. En caso de que queramos crearla tendremos que indicarlo con:
```shell=
$useradd -m userNuevo
```
- **adduser**: crea un nuevo usuario y su respectiva carpeta en /home. La desventaja es que este comando no es compatible con todas las distribuciones de Linux.
Para comprobar que un usuario se ha creado correctamente podremos usar:
```shell=
$cat /etc/passwd
```
Para saber la configuración de un usuario en concreto:
```shell=
$id user1dpl
```
Esto nos indicará, entre otras cosas, a que grupos pertenece nuestro usuario.
Para crear un grupo usaremos:
```shell=
$addgroup grupo1
```
Y para añadir a un usuario al grupo tendremos que hacer:
```shell=
$usermod -a -G grupo1 user1dpl
```
#### Cambiar permisos y grupos a carpetas
Para saber a que grupo pertenece una carpeta y los permisos que hay sobre ella haremos uso de:
```shell=
$ls -l
```
Ponemos al grupo1 como propietario de una carpeta (carpetaPrueba):
```shell=
$chgrp grupo1 carpetaPrueba
```
Le damos todos los permisos al grupo sobre la carpeta:
```shell=
$chmod 775 carpetaPrueba
```
#### Restringir carpetas a usuarios
Para restrigir carpetas a ciertos usuarios haremos uso de:
```shell=
DefaultRoot /home/carpetaPrueba grupo1
DefaultRoot ~
```
Debemos tener en cuenta reiniciar el ftp tras este paso.
Una vez hecho esto, podremos iniciar sesión con un usuario que pertenezca a dicho grupo y comprobaremos que se ha hecho todo correctamente.
#### Permitir y denegar usuarios en FTP
Iremos a nuestro archivo proftpd.conf y añadiremos al final del fichero:
```shell=
<Limit LOGIN>
AllowUser user1dpl
DenyALL
</Limit>
```
Los diferentes parámetros que podemos usar son:
- **AllowUser [nombre del usuario]**: permitimos el acceso a un usuario en específico.
- **DenyUser [nombre del usuario]**: bloqueamos el acceso a un usuario en específico.
- **DenyAll**: bloqueamos a todos los usuarios (salvo los que permitamos con AllowUser).
- **AllowAll**: permitimos que los usuarios como "anonymous" se conecten al FTP.
#### Configurar FTP como privado y anónimo
Descomentar las siguientes líneas del fichero proftpd.conf, del directorio ***/etc/proftpd/***:

Y con esto, si entramos como usuario anónimo veremos que no nos deja hacer nada.
### Conectar Servidor desde Windows
Recuerda que podemos ver nuestra ip pública y privada de la siguiente forma:
```bash=
$ ip a (Desde el ftp de virtualBox)
```

Vamos al fileZilla y colocamos los datos en cuestión para poder acceder.

###### tags: `DAW` `DPL` `UT1` `UT2` `apache2`