COMO INSTALAR NEXTCLOUD 20 EN UBUNTU 20.04 LTS O DEBIAN 10.5 BUSTER

Este artículo describe la instalación, configuración y endurecimiento, monitorización y algunas opciones de expansión de Nextcloud en un servidor Ubuntu 20.04 LTS Focal Fossa o Debian Server 10.5 Buster. La instalación se basa en los componentes nginx 1.19x mainline, Let’s Encrypt TLS 1.3, MariaDB 10.5, PHP 7.4, Redis, Fail2ban, ufw y Netdata y finalmente recibe una calificación de seguridad A + de Nextcloud así como de Qualys SSL Labs. En el transcurso de estas instrucciones sólo tienes que sustituir los valores marcados en rojo como tu.dominio.de o 192.168.2.x por los valores correspondientes de tu sistema.

Contenidos:

  1. Preparación e instalación del servidor web nginx
  2. Instalación y configuración de PHP 7.4
  3. Instalación y configuración del servidor de bases de datos MariaDB 10.5
  4. Instalación del servidor Redis (“base de datos en memoria”)
  5. Instalación y optimización de Nextcloud (incluyendo SSL)
  6. Endurecimiento del sistema (fail2ban y ufw)
  7. Optimizar y actualizar el Nextcloud mediante un script
  1. Preparación e instalación del servidor web nginx

Los medios de instalación del servidor Linux subyacente están disponibles aquí:

como instalar nextcloud 20

Ubuntu 20.04.x LTS: Requisitos

descargar el medio de instalación – se requiere SSH (ver imagen anterior)

como instalar nextcloud 20

Debian 10.5.x: Requisitos

descargar el medio de instalación – se requieren herramientas estándar del sistema y SSH (ver imagen anterior)

su –
apt install -y sudo
usermod -aG sudo <usuario actual>
exit

Debian y Ubuntu Server:

Pasar al modo de usuario privilegiado

sudo -s

Instalar los siguientes paquetes de software como base necesaria para el funcionamiento del servidor:

apt install -y curl gnupg2 git lsb-release ssl-cert ca-certificates apt-transport-https tree locate software-properties-common dirmngr screen htop net-tools zip unzip bzip2 ffmpeg ghostscript libfile-fcntllock-perl libfontconfig1 libfuse2

Compruebe que el servicio de servidor de tiempo está configurado con al menos un punto final.

nano /etc/systemd/timesyncd.conf

Si la línea NTP está comentada ( # NTP = ), elimine el carácter ‘#’ delante de NTP y añada, por ejemplo, estos dos servidores de tiempo:

NTP=server 0.us.pool.ntp.org server 1.us.pool.ntp.org

Guarde este archivo y reinicie el servidor de tiempo:

systemctl restart systemd-timesyncd

Añada más repositorios de software (fuentes de software) al sistema para poder instalar las versiones actuales de los respectivos paquetes. Cambie al siguiente directorio:

cd /etc/apt/sources.list.d

Sólo Ubuntu Server (AMD64 y ARM64):

Si es necesario, corrija primero la resolución del DNS:

rm -f /etc/resolv.conf
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved.service

A continuación, añada las fuentes de software para nginx, PHP y MariaDB:

echo "deb http://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" | tee nginx.list
echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu $(lsb_release -cs) main" | tee php.list
echo "deb http://ftp.hosteurope.de/mirror/mariadb.org/repo/10.5/ubuntu $(lsb_release -cs) main" | tee mariadb.list

Para poder confiar en estas fuentes utilizamos las claves correspondientes:

PHP-Key:

apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 4F4EA0AAE5267A6C

Sólo para Debian Server (AMD64):

Añade las fuentes de software para nginx, PHP y MariaDB:

echo "deb [arch=amd64] http://nginx.org/packages/mainline/debian $(lsb_release -cs) nginx" | tee nginx.list
echo "deb [arch=amd64] https://packages.sury.org/php/ $(lsb_release -cs) main" | tee php.list
echo "deb [arch=amd64] http://mirror2.hs-esslingen.de/mariadb/repo/10.5/debian $(lsb_release -cs) main" | tee mariadb.list

Para poder confiar en las fuentes respectivas utilizamos las claves correspondientes:

PHP-Key:

wget -q https://packages.sury.org/php/apt.gpg -O- | apt-key add -

A partir de aquí, se vuelve a los dos sistemas operativos para servidores (Ubuntu y Debian):

Añadimos las claves que faltan para nginx y MariaDB, actualizamos el sistema y generamos los llamados certificados autofirmados, que serán sustituidos por certificados completos de Let’s Encrypt en el curso posterior.

NGINX-Key:

curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

MariaDB-Key:

apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 0xF1656F24C74CD1D8
apt update && apt upgrade -y
make-ssl-cert generate-default-snakeoil -y

Para garantizar que ninguna reliquia de instalaciones anteriores interfiera con el funcionamiento del servidor web, las eliminamos:

apt remove nginx nginx-extras nginx-common nginx-full -y --allow-change-held-packages

También nos aseguramos de que el homólogo (Apache2) del servidor web nginx no está activo ni instalado.

systemctl stop apache2.service && systemctl disable apache2.service

Ahora los preparativos para instalar el servidor web están completos y podemos instalarlo con el siguiente comando

apt install nginx -y

y que el servicio se inicie automáticamente tras un reinicio del sistema mediante

systemctl enable nginx.service

Configuración. Con vistas a los ajustes posteriores, se guarda la configuración estándar y se abre un nuevo archivo de configuración:

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak && touch /etc/nginx/nginx.conf
nano /etc/nginx/nginx.conf

Copie todo el contenido de abajo en el archivo y sustituya los valores marcados en rojo según su sistema:

user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
multi_accept on; use epoll;
}
http {
server_names_hash_bucket_size 64;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
set_real_ip_from 127.0.0.1;
#optional, Sie können das eigene Subnetz ergänzen, bspw.:
# set_real_ip_from 192.168.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
send_timeout 3600;
tcp_nopush on;
tcp_nodelay on;
open_file_cache max=500 inactive=10m;
open_file_cache_errors on;
keepalive_timeout 65;
reset_timedout_connection on;
server_tokens off;
resolver 127.0.0.53 valid=30s;
resolver_timeout 5s;
include /etc/nginx/conf.d/*.conf;
}

Guarde el archivo y ciérrelo, luego reinicie el servidor web:

service nginx restart

Para preparar los certificados SSL y los directorios web, creamos cuatro carpetas y establecemos los permisos correctos:

mkdir -p /var/nc_data /var/www/letsencrypt/.well-known/acme-challenge /etc/letsencrypt/rsa-certs /etc/letsencrypt/ecc-certs
chown -R www-data:www-data /var/nc_data /var/www

La instalación del servidor web está ahora completa y continuaremos con la instalación y personalización de PHP.

 

2.  Instalación y configuración de PHP 7.4 (fpm)

El repositorio de PHP ya ha sido configurado y activado en el capítulo anterior, así que podemos empezar directamente con la instalación:

apt update && apt install -y php7.4-fpm php7.4-gd php7.4-mysql php7.4-curl php7.4-xml php7.4-zip php7.4-intl php7.4-mbstring php7.4-json php7.4-bz2 php7.4-ldap php7.4-apcu php7.4-bcmath php7.4-gmp php7.4-imagick php7.4-smbclient imagemagick ldap-utils

Establezca el formato de fecha correcto para permitir también el registro correcto:

timedatectl set-timezone America/New_York

Antes de empezar a optimizar PHP, hacemos una copia de seguridad de los archivos de configuración:

cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/www.conf.bak
cp /etc/php/7.4/cli/php.ini /etc/php/7.4/cli/php.ini.bak
cp /etc/php/7.4/fpm/php.ini /etc/php/7.4/fpm/php.ini.bak
cp /etc/php/7.4/fpm/php-fpm.conf /etc/php/7.4/fpm/php-fpm.conf.bak
cp /etc/php/7.4/mods-available/apcu.ini /etc/php/7.4/mods-available/apcu.ini.bak
cp /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml.bak

Ahora, realiza todas las siguientes optimizaciones:

sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm.max_children =.*/pm.max_children = 120/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm.start_servers =.*/pm.start_servers = 12/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm.min_spare_servers =.*/pm.min_spare_servers = 6/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm.max_spare_servers =.*/pm.max_spare_servers = 18/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/7.4/cli/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/7.4/cli/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/7.4/cli/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/7.4/cli/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/7.4/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = America\/\New_York/" /etc/php/7.4/cli/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 1024M/" /etc/php/7.4/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/7.4/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/7.4/fpm/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/7.4/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/7.4/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/7.4/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = America\/\New_York/" /etc/php/7.4/fpm/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=128/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=1/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/7.4/fpm/php.ini
sed -i '$aapc.enable_cli=1' /etc/php/7.4/mods-available/apcu.ini
sed -i "s/rights=\"none\" pattern=\"PS\"/rights=\"read|write\" pattern=\"PS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"EPS\"/rights=\"read|write\" pattern=\"EPS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"PDF\"/rights=\"read|write\" pattern=\"PDF\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"XPS\"/rights=\"read|write\" pattern=\"XPS\"/" /etc/ImageMagick-6/policy.xml

Ahora reinicie ambos servicios, nginx y PHP:

service php7.4-fpm restart
service nginx restart

Además, PHP ya está instalado y optimizado para Nextcloud. Para más optimizaciones de PHP, puede encontrar más opciones de ajuste en este artículo. Comencemos con la instalación y configuración del servidor de bases de datos MariaDB.

3. Instalación y configuración de MariaDB 10.5

La instalación de MariaDB se realiza con este comando:

apt update && apt install mariadb-server -y

Vamos a endurecer el servidor de base de datos utilizando la herramienta suministrada “mysql_secure_installation”. Cuando se instala por primera vez, no hay contraseña de root, por lo que se puede confirmar la consulta con ENTER. Se recomienda establecer una contraseña directamente, el diálogo correspondiente aparece automáticamente:

mysql_secure_installation
Enter current password for root (enter for none): <ENTER> or type the password
Switch to unix_socket authentication [Y/n] Y
Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Ahora detenga el servidor de la base de datos y guarde la configuración estándar para poder hacer ajustes inmediatamente después:

service mysql stop
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
nano /etc/mysql/my.cnf

Copie todas las líneas siguientes en el archivo vacío:

[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
bulk_insert_buffer_size = 16M
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
concurrent_insert = 2
connect_timeout = 5
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
general_log = 0
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 4000
innodb_flush_method = O_DIRECT
key_buffer_size = 128M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_allowed_packet = 16M
max_binlog_size = 100M
max_connections = 200
max_heap_table_size = 64M
myisam_recover_options = BACKUP
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 2M
query_cache_size = 64M
query_cache_type = 1
query_cache_min_res_unit = 2k
read_buffer_size = 2M
read_rnd_buffer_size = 1M
skip-external-locking
skip-name-resolve
slow_query_log_file = /var/log/mysql/mariadb-slow.log
slow-query-log = 1
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 4M
table_open_cache = 400
thread_cache_size = 128
tmp_table_size = 64M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
#unix_socket=OFF
user = mysql
wait_timeout = 600
[mysqldump]
max_allowed_packet = 16M
quick
quote-names
[isamchk]
key_buffer = 16M

Guarda y cierra el archivo, luego reinicia el servidor de la base de datos para configurar la base de datos Nextcloud, el usuario Nextcloud y su contraseña:

service mysql restart
mysql -uroot -p

Explicación:

Nombre de la base de datos: nextcloud

Usuario de la base de datos: nextcloud

Contraseña del usuario de la base de datos: nextcloud

CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextcloud@localhost identified by 'nextcloud'; GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost; FLUSH privileges; quit;

Compruebe que el nivel de aislamiento (read commit) y el conjunto de caracteres (utf8mb4) están configurados correctamente:

mysql -h localhost -uroot -p -e "SELECT @@TX_ISOLATION; SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='nextcloud'"

Si la salida (resultset) muestra “READ-COMMITTED” y “utf8mb4_general_ci” todo se ha configurado correctamente y podemos proceder a la instalación de Redis.

4. instalación y configuración de Redis

Instalamos el servidor Redis para aumentar el rendimiento de Nextcloud, porque Redis reduce la carga de la base de datos MariaDB Nextcloud:

apt update && apt install redis-server php7.4-redis -y

Ajuste la redistribución guardando y ajustando la configuración ejecutando los siguientes comandos:

cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sed -i "s/port 6379/port 0/" /etc/redis/redis.conf
sed -i s/\#\ unixsocket/\unixsocket/g /etc/redis/redis.conf
sed -i "s/unixsocketperm 700/unixsocketperm 770/" /etc/redis/redis.conf
sed -i "s/# maxclients 10000/maxclients 512/" /etc/redis/redis.conf
usermod -aG redis www-data
cp /etc/sysctl.conf /etc/sysctl.conf.bak
sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf

Por experiencia suficiente en la instalación, te recomiendo que reinicies todo el servidor una vez:

reboot now

En hora buena, el servidor ya está instalado y configurado, así que ahora puedes empezar a configurar Nextcloud.

5. instalación y optimización de Nextcloud (incl. SSL)

Ahora configuramos diferentes vhost, archivos de configuración del servidor y modificamos el archivo vhost por defecto de forma persistente. Como el sistema se reinició antes, cambiamos al modo de usuario privilegiado de nuevo, guardamos el archivo vhost por defecto llamado default.conf y creamos archivos vhost vacíos para configurar.

sudo -s
[ -f /etc/nginx/conf.d/default.conf ] && mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
touch /etc/nginx/conf.d/default.conf
touch /etc/nginx/conf.d/http.conf
touch /etc/nginx/conf.d/nextcloud.conf

Así, el archivo “default.conf” vacío garantiza que esta configuración por defecto no afecte al funcionamiento de Nextcloud aunque el servidor web se actualice posteriormente.

Cree el archivo global vhost para redirigir permanentemente las peticiones http por defecto a https y también habilite la comunicación del certificado SSL con Let’sEncrypt.

nano /etc/nginx/conf.d/http.conf

Copie todas las líneas siguientes en el archivo http.conf y ajuste los valores marcados en rojo según su sistema:

upstream php-handler {
server unix:/run/php/php7.4-fpm.sock;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name ihre.domain.de;
root /var/www;
location ^~ /.well-known/acme-challenge {
default_type text/plain;
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}

Guarde y cierre este archivo. Ahora edita el archivo Nextcloud vHost real nextcloud.conf, que contiene todas las configuraciones para el funcionamiento de Nextcloud.

nano /etc/nginx/conf.d/nextcloud.conf

Copie todas las líneas siguientes en el archivo nextcloud.conf y ajuste los valores resaltados en rojo según su sistema:

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ihre.domain.de;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_trusted_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
#ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem;
#ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384';
ssl_ecdh_curve X448:secp521r1:secp384r1; 
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
fastcgi_hide_header X-Powered-By;
fastcgi_read_timeout 3600;
fastcgi_send_timeout 3600;
fastcgi_connect_timeout 3600;
root /var/www/nextcloud;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location = /.well-known/carddav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
client_max_body_size 10240M;
fastcgi_buffers 64 4K;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
location / {
rewrite ^ /index.php;
}
location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
deny all;
}
location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location ^~ /apps/rainloop/app/data {
deny all;
}
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
try_files $uri/ =404;
index index.php;
}
location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463";
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
try_files $uri /index.php$request_uri;
access_log off;
}
}

Guarde y cierre este archivo y, a continuación, amplíe la seguridad del servidor y del sistema activando el intercambio seguro de claves mediante una clave Diffie-Hellman (dhparam.pem):

openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Por favor, tenga paciencia. La generación puede tardar – dependiendo del rendimiento del sistema – unos minutos. Sólo cuando la generación se ha completado, iniciamos de nuevo el servidor web.

service nginx restart

Ahora comenzamos la instalación “real” del software Nextcloud y configuramos los certificados SSL de Let’s Encrypt usando acme. Para ello, cambie al directorio de trabajo

cd /usr/local/src

y descargar la última versión de Nextcloud:

wget https://download.nextcloud.com/server/releases/latest.tar.bz2
wget https://download.nextcloud.com/server/releases/latest.tar.bz2.md5

Comprueba los archivos:

md5sum -c latest.tar.bz2.md5 < latest.tar.bz2

Sólo si la prueba se confirma con “OK”, continuaremos.

como instalar nextcloud 20

Descomprime el software Nextcloud en el directorio web (var/www), luego establece el permiso adecuadamente y elimina el archivo de descarga:

tar -xjf latest.tar.bz2 -C /var/www && chown -R www-data:www-data /var/www/ && rm -f latest.tar.bz2

Asegúrese de que se puede acceder a su servidor desde el exterior a través del puerto 80/TCP y del puerto 443/TCP. La creación y actualización de los certificados Let’s Encrypt es obligatoria a través de http y del puerto 80. Para el manejo de los certificados ahora creamos un usuario dedicado y lo añadimos al grupo www-data:

adduser --disabled-login acmeuser
usermod -a -G www-data acmeuser

Seguimos dando a este usuario técnico los permisos necesarios para poder iniciar el arranque necesario del servidor web en caso de renovación del certificado.

visudo

En el medio del archivo, abajo

[..]
User privilege specification
root ALL=(ALL:ALL) ALL
[...]

introduzca la siguiente línea:

acmeuser ALL=NOPASSWD: /bin/systemctl reload nginx.service
como instalar nextcloud 20

Con CTRL+X seguido de una y guarda y sale de este archivo.

Cambie al shell del nuevo usuario (acmeuser) para instalar el software del certificado y abandone este shell después:

su - acmeuser
curl https://get.acme.sh | sh
exit

Ajuste los permisos adecuados para poder almacenar los nuevos certificados en él:

chmod -R 775 /var/www/letsencrypt /etc/letsencrypt && chown -R www-data:www-data /var/www/ /etc/letsencrypt

Volver a cambiar al shell del nuevo usuario

su - acmeuser

y pedir (solicitar) los certificados SSL. Sustituya su.dominio.de por su dominio :

acme.sh --issue -d ihre.domain.de --keylength 4096 -w /var/www/letsencrypt --key-file /etc/letsencrypt/rsa-certs/privkey.pem --ca-file /etc/letsencrypt/rsa-certs/chain.pem --cert-file /etc/letsencrypt/rsa-certs/cert.pem --fullchain-file /etc/letsencrypt/rsa-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
acme.sh --issue -d ihre.domain.de --keylength ec-384 -w /var/www/letsencrypt --key-file /etc/letsencrypt/ecc-certs/privkey.pem --ca-file /etc/letsencrypt/ecc-certs/chain.pem --cert-file /etc/letsencrypt/ecc-certs/cert.pem --fullchain-file /etc/letsencrypt/ecc-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"

Salir del shell del nuevo usuario

exit

y luego crear un script que compruebe y corrija los permisos en el futuro (permissions.sh):

nano /root/permissions.sh

Copie todas las líneas en el archivo:

#!/bin/bash
find /var/www/ -type f -print0 | xargs -0 chmod 0640
find /var/www/ -type d -print0 | xargs -0 chmod 0750
chmod -R 775 /var/www/letsencrypt /etc/letsencrypt 
chown -R www-data:www-data /var/www /etc/letsencrypt
chown -R www-data:www-data /var/nc_data
chmod 0644 /var/www/nextcloud/.htaccess
chmod 0644 /var/www/nextcloud/.user.ini
exit 0

Marque el script como ejecutable y luego ejecútelo directamente:

chmod +x /root/permissions.sh
/root/permissions.sh

Elimine de nginx los certificados autofirmados utilizados anteriormente y active los nuevos certificados SSL totalmente válidos de Let’s Encrypt que ya son válidos. A continuación, reinicie el servidor web:

sed -i '/ssl-cert-snakeoil/d' /etc/nginx/conf.d/nextcloud.conf
sed -i s/#\ssl/\ssl/g /etc/nginx/conf.d/nextcloud.conf
service nginx restart

Para renovar los certificados SSL automáticamente, así como para iniciar el reinicio necesario del servidor web, se creó automáticamente una tarea cron.

crontab -l -u acmeuser

Ahora podemos proceder a la configuración de Nextcloud. Para ello, utilice el siguiente comando de instalación “silenciosa”:

sudo -u www-data php /var/www/nextcloud/occ maintenance:install --database "mysql" --database-name "nextcloud" --database-user "nextcloud" --database-pass "nextcloud" --admin-user "YourNextcloudAdmin" --admin-pass "YourNextcloudAdminPasssword" --data-dir "/var/nc_data"

Explicaciones:

database-name “nextcloud” : nombre de la base de datos del capítulo 3.

usuario de base de datos “nextcloud” : usuario de base de datos del capítulo 3

database-pass “nextcloud” : contraseña del usuario de la base de datos del capítulo 3

admin-user “YourNextcloudAdmin” : libremente seleccionable por usted

admin-pass “YourNextcloudAdminPasssword” : libremente seleccionable por usted

Espera a que la instalación de Nextcloud esté completa y luego personaliza el archivo de configuración central de Nextcloud “config.php” como el usuario web www-data:

1. Añada su dominio como dominio de confianza, añada su dominio .de con su dominio dedicado:

sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 0 --value=ihre.domain.de

2. configure su dominio como overwrite.cli.url, añadiendo su.dominio.de con su dominio dedicado:

sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://ihre.domain.de

Ahora, finalmente, ampliamos la configuración de Nextcloud. Primero guarde el config.php existente y luego ejecute las siguientes líneas en un bloque:

sudo -u www-data cp /var/www/nextcloud/config/config.php /var/www/nextcloud/config/config.php.bak
sudo -u www-data sed -i 's/^[ ]*//' /var/www/nextcloud/config/config.php
sudo -u www-data sed -i '/);/d' /var/www/nextcloud/config/config.php
sudo -u www-data cat <<EOF >>/var/www/nextcloud/config/config.php
'activity_expire_days' => 14,
'auth.bruteforce.protection.enabled' => true,
'blacklisted_files' => 
array (
0 => '.htaccess',
1 => 'Thumbs.db',
2 => 'thumbs.db',
),
'cron_log' => true,
'enable_previews' => true,
'enabledPreviewProviders' => 
array (
0 => 'OC\Preview\PNG',
1 => 'OC\Preview\JPEG',
2 => 'OC\Preview\GIF',
3 => 'OC\Preview\BMP',
4 => 'OC\Preview\XBitmap',
5 => 'OC\Preview\Movie',
6 => 'OC\Preview\PDF',
7 => 'OC\Preview\MP3',
8 => 'OC\Preview\TXT',
9 => 'OC\Preview\MarkDown',
),
'filesystem_check_changes' => 0,
'filelocking.enabled' => 'true',
'htaccess.RewriteBase' => '/',
'integrity.check.disabled' => false,
'knowledgebaseenabled' => false,
'logfile' => '/var/nc_data/nextcloud.log',
'loglevel' => 2,
'logtimezone' => 'Europe/Berlin',
'log_rotate_size' => 104857600,
'maintenance' => false,
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'overwriteprotocol' => 'https',
'preview_max_x' => 1024,
'preview_max_y' => 768,
'preview_max_scale_factor' => 1,
'redis' => 
array (
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
'timeout' => 0.0,
),
'quota_include_external_storage' => false,
'share_folder' => '/Shares',
'skeletondirectory' => '',
'theme' => '',
'trashbin_retention_obligation' => 'auto, 7',
'updater.release.channel' => 'stable',
);
EOF

Modificar el archivo “.user.ini”

sudo -u www-data sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini

y pasar las aplicaciones de Nextcloud como usuario www-data a

sudo -u www-data php /var/www/nextcloud/occ app:disable survey_client
sudo -u www-data php /var/www/nextcloud/occ app:disable firstrunwizard
sudo -u www-data php /var/www/nextcloud/occ app:enable admin_audit
sudo -u www-data php /var/www/nextcloud/occ app:enable files_pdfviewer

Nextcloud ya está totalmente operativo, optimizado y protegido. Reinicie todos los servicios relevantes:

service nginx stop
service php7.4-fpm stop
service mysql restart
service php7.4-fpm restart
service redis-server restart
service nginx restart

Configure un cronjob para Nextcloud como usuario “www-data”:

crontab -u www-data -e

Inserte esta línea

*/5 * * * * php -f /var/www/nextcloud/cron.php > /dev/null 2>&1

A continuación, guarde y cierre el archivo y reconfigure el trabajo de Nextcloud de “Ajax” a “Cron” utilizando la CLI de Nextclouds:

sudo -u www-data php /var/www/nextcloud/occ background:cron

6. endurecimiento (fail2ban y ufw)

Primero instalamos fail2ban para proteger el servidor contra los ataques de fuerza bruta y los intentos de inicio de sesión incorrectos:

apt update && apt install fail2ban -y

Cree un nuevo archivo de filtro y rellénelo como se describe a continuación.

touch /etc/fail2ban/filter.d/nextcloud.conf

Copie todo desde “cat …” hasta “… EOF” en su portapapeles y luego péguelo en el shell:

cat <<EOF >/etc/fail2ban/filter.d/nextcloud.conf
[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
            ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
EOF

Confirme con <ENTER> para llenar el archivo. El resultado será el siguiente:

cat /etc/fail2ban/filter.d/nextcloud.conf

Ahora crea un nuevo archivo jail

nano /etc/fail2ban/jail.d/nextcloud.local

Copie todas las líneas siguientes en él:

[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 5
bantime = 3600
findtime = 36000
logpath = /var/nc_data/nextcloud.log

Con los parámetros mostrados anteriormente, después de 5 intentos fallidos de inicio de sesión (maxretry) en los últimos 36000 segundos (findtime, que equivale a 10h), la IP del potencial atacante será bloqueada durante un periodo de 3600 segundos (bantime, que equivale a 1h).

Reinicie fail2ban y compruebe el estado de fail2ban:

service fail2ban restart
fail2ban-client status nextcloud

A partir de ahora, las direcciones IP que hayan realizado 5 o más intentos fallidos de inicio de sesión en las últimas 10 horas serán bloqueadas durante 1 hora, protegiendo su servidor de nuevos ataques. Si quieres probar el bloqueo manualmente y desbloquear el bloqueo resultante de tu IP o de las IPs ya bloqueadas, ejecuta primero este comando,

fail2ban-client status nextcloud

para mostrar las direcciones IP bloqueadas. Puede desbloquear la(s) IP(s) mostrada(s) utilizando el siguiente comando:

fail2ban-client set nextcloud unbanip <ip-adresse>

Por último, instalamos un firewall, el llamado firewall sin complicaciones (ufw):

Si has cambiado el puerto SSH de 22 a otro puerto antes, tienes que reemplazar el 22 en consecuencia.

apt install ufw -y
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 22/tcp

Si no quieres compartir SSH externamente (¡recomendado!) y sólo quieres usarlo desde la red interna, sustituye el último comando ufw (ufw allow 22/tcp) por éste:

ufw allow proto tcp from 192.168.2.0/24 to any port 22

Sustituya la red de ejemplo (192.168.2.0/24) por la red que esté utilizando.

Configure el registro del cortafuegos en “medio” y evite las conexiones entrantes no definidas.

ufw logging medium
ufw default deny incoming

Active el cortafuegos y reinícielo:

ufw enable
service ufw restart

7. Optimizar y actualizar el Nextcloud mediante un script

Crear un script para actualizar y optimizar el Nextcloud y las aplicaciones activadas:

 

cd /root
nano upgrade.sh
#!/bin/bash
/usr/sbin/service nginx stop
sudo -u www-data php /var/www/nextcloud/updater/updater.phar
sudo -u www-data php /var/www/nextcloud/occ status
sudo -u www-data php /var/www/nextcloud/occ -V
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-primary-keys
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-columns
sudo -u www-data php /var/www/nextcloud/occ db:convert-filecache-bigint
sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini
chown -R www-data:www-data /var/www/nextcloud
redis-cli -s /var/run/redis/redis-server.sock <<EOF
FLUSHALL
quit
EOF
sudo -u www-data php /var/www/nextcloud/occ files:scan --all
sudo -u www-data php /var/www/nextcloud/occ files:scan-app-data
sudo -u www-data php /var/www/nextcloud/occ app:update --all
/usr/sbin/service php7.4-fpm restart
/usr/sbin/service nginx restart
exit 0

Marque el script como ejecutable y ejecútelo regularmente como usuario con privilegios.

chmod +x /root/upgrade.sh
/root/upgrade.sh

La instalación y el aseguramiento de su Nextcloud Server se ha completado con éxito, por lo que le deseo mucha diversión con sus datos en su nube privada. Si quieres probar antes de atreverte hacer esta instalación, puedes registrarte para que crear una cuenta en: https://tunube.ga, para mas información sobre nuestros servicios haz click al: https://easyvhost.com o https://consultasinformaticas.com

Open chat

COMO INSTALAR NEXTCLOUD 20 EN UBUNTU 20.04 LTS O DEBIAN 10.5 BUSTER

Este artículo describe la instalación, configuración y endurecimiento, monitorización y algunas opciones de expansión de Nextcloud en un servidor Ubuntu 20.04 LTS Focal Fossa o Debian Server 10.5 Buster. La instalación se basa en los componentes nginx 1.19x mainline, Let’s Encrypt TLS 1.3, MariaDB 10.5, PHP 7.4, Redis, Fail2ban, ufw y Netdata y finalmente recibe una calificación de seguridad A + de Nextcloud así como de Qualys SSL Labs. En el transcurso de estas instrucciones sólo tienes que sustituir los valores marcados en rojo como tu.dominio.de o 192.168.2.x por los valores correspondientes de tu sistema.

Contenidos:

  1. Preparación e instalación del servidor web nginx
  2. Instalación y configuración de PHP 7.4
  3. Instalación y configuración del servidor de bases de datos MariaDB 10.5
  4. Instalación del servidor Redis (“base de datos en memoria”)
  5. Instalación y optimización de Nextcloud (incluyendo SSL)
  6. Endurecimiento del sistema (fail2ban y ufw)
  7. Optimizar y actualizar el Nextcloud mediante un script
  1. Preparación e instalación del servidor web nginx

Los medios de instalación del servidor Linux subyacente están disponibles aquí:

como instalar nextcloud 20

Ubuntu 20.04.x LTS: Requisitos

descargar el medio de instalación – se requiere SSH (ver imagen anterior)

como instalar nextcloud 20

Debian 10.5.x: Requisitos

descargar el medio de instalación – se requieren herramientas estándar del sistema y SSH (ver imagen anterior)

su –
apt install -y sudo
usermod -aG sudo <usuario actual>
exit

Debian y Ubuntu Server:

Pasar al modo de usuario privilegiado

sudo -s

Instalar los siguientes paquetes de software como base necesaria para el funcionamiento del servidor:

apt install -y curl gnupg2 git lsb-release ssl-cert ca-certificates apt-transport-https tree locate software-properties-common dirmngr screen htop net-tools zip unzip bzip2 ffmpeg ghostscript libfile-fcntllock-perl libfontconfig1 libfuse2

Compruebe que el servicio de servidor de tiempo está configurado con al menos un punto final.

nano /etc/systemd/timesyncd.conf

Si la línea NTP está comentada ( # NTP = ), elimine el carácter ‘#’ delante de NTP y añada, por ejemplo, estos dos servidores de tiempo:

NTP=server 0.us.pool.ntp.org server 1.us.pool.ntp.org

Guarde este archivo y reinicie el servidor de tiempo:

systemctl restart systemd-timesyncd

Añada más repositorios de software (fuentes de software) al sistema para poder instalar las versiones actuales de los respectivos paquetes. Cambie al siguiente directorio:

cd /etc/apt/sources.list.d

Sólo Ubuntu Server (AMD64 y ARM64):

Si es necesario, corrija primero la resolución del DNS:

rm -f /etc/resolv.conf
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved.service

A continuación, añada las fuentes de software para nginx, PHP y MariaDB:

echo "deb http://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" | tee nginx.list
echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu $(lsb_release -cs) main" | tee php.list
echo "deb http://ftp.hosteurope.de/mirror/mariadb.org/repo/10.5/ubuntu $(lsb_release -cs) main" | tee mariadb.list

Para poder confiar en estas fuentes utilizamos las claves correspondientes:

PHP-Key:

apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 4F4EA0AAE5267A6C

Sólo para Debian Server (AMD64):

Añade las fuentes de software para nginx, PHP y MariaDB:

echo "deb [arch=amd64] http://nginx.org/packages/mainline/debian $(lsb_release -cs) nginx" | tee nginx.list
echo "deb [arch=amd64] https://packages.sury.org/php/ $(lsb_release -cs) main" | tee php.list
echo "deb [arch=amd64] http://mirror2.hs-esslingen.de/mariadb/repo/10.5/debian $(lsb_release -cs) main" | tee mariadb.list

Para poder confiar en las fuentes respectivas utilizamos las claves correspondientes:

PHP-Key:

wget -q https://packages.sury.org/php/apt.gpg -O- | apt-key add -

A partir de aquí, se vuelve a los dos sistemas operativos para servidores (Ubuntu y Debian):

Añadimos las claves que faltan para nginx y MariaDB, actualizamos el sistema y generamos los llamados certificados autofirmados, que serán sustituidos por certificados completos de Let’s Encrypt en el curso posterior.

NGINX-Key:

curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

MariaDB-Key:

apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 0xF1656F24C74CD1D8
apt update && apt upgrade -y
make-ssl-cert generate-default-snakeoil -y

Para garantizar que ninguna reliquia de instalaciones anteriores interfiera con el funcionamiento del servidor web, las eliminamos:

apt remove nginx nginx-extras nginx-common nginx-full -y --allow-change-held-packages

También nos aseguramos de que el homólogo (Apache2) del servidor web nginx no está activo ni instalado.

systemctl stop apache2.service && systemctl disable apache2.service

Ahora los preparativos para instalar el servidor web están completos y podemos instalarlo con el siguiente comando

apt install nginx -y

y que el servicio se inicie automáticamente tras un reinicio del sistema mediante

systemctl enable nginx.service

Configuración. Con vistas a los ajustes posteriores, se guarda la configuración estándar y se abre un nuevo archivo de configuración:

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak && touch /etc/nginx/nginx.conf
nano /etc/nginx/nginx.conf

Copie todo el contenido de abajo en el archivo y sustituya los valores marcados en rojo según su sistema:

user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
multi_accept on; use epoll;
}
http {
server_names_hash_bucket_size 64;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
set_real_ip_from 127.0.0.1;
#optional, Sie können das eigene Subnetz ergänzen, bspw.:
# set_real_ip_from 192.168.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
send_timeout 3600;
tcp_nopush on;
tcp_nodelay on;
open_file_cache max=500 inactive=10m;
open_file_cache_errors on;
keepalive_timeout 65;
reset_timedout_connection on;
server_tokens off;
resolver 127.0.0.53 valid=30s;
resolver_timeout 5s;
include /etc/nginx/conf.d/*.conf;
}

Guarde el archivo y ciérrelo, luego reinicie el servidor web:

service nginx restart

Para preparar los certificados SSL y los directorios web, creamos cuatro carpetas y establecemos los permisos correctos:

mkdir -p /var/nc_data /var/www/letsencrypt/.well-known/acme-challenge /etc/letsencrypt/rsa-certs /etc/letsencrypt/ecc-certs
chown -R www-data:www-data /var/nc_data /var/www

La instalación del servidor web está ahora completa y continuaremos con la instalación y personalización de PHP.

 

2.  Instalación y configuración de PHP 7.4 (fpm)

El repositorio de PHP ya ha sido configurado y activado en el capítulo anterior, así que podemos empezar directamente con la instalación:

apt update && apt install -y php7.4-fpm php7.4-gd php7.4-mysql php7.4-curl php7.4-xml php7.4-zip php7.4-intl php7.4-mbstring php7.4-json php7.4-bz2 php7.4-ldap php7.4-apcu php7.4-bcmath php7.4-gmp php7.4-imagick php7.4-smbclient imagemagick ldap-utils

Establezca el formato de fecha correcto para permitir también el registro correcto:

timedatectl set-timezone America/New_York

Antes de empezar a optimizar PHP, hacemos una copia de seguridad de los archivos de configuración:

cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/www.conf.bak
cp /etc/php/7.4/cli/php.ini /etc/php/7.4/cli/php.ini.bak
cp /etc/php/7.4/fpm/php.ini /etc/php/7.4/fpm/php.ini.bak
cp /etc/php/7.4/fpm/php-fpm.conf /etc/php/7.4/fpm/php-fpm.conf.bak
cp /etc/php/7.4/mods-available/apcu.ini /etc/php/7.4/mods-available/apcu.ini.bak
cp /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml.bak

Ahora, realiza todas las siguientes optimizaciones:

sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm.max_children =.*/pm.max_children = 120/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm.start_servers =.*/pm.start_servers = 12/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm.min_spare_servers =.*/pm.min_spare_servers = 6/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm.max_spare_servers =.*/pm.max_spare_servers = 18/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/7.4/cli/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/7.4/cli/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/7.4/cli/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/7.4/cli/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/7.4/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = America\/\New_York/" /etc/php/7.4/cli/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 1024M/" /etc/php/7.4/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/7.4/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/7.4/fpm/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/7.4/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/7.4/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/7.4/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = America\/\New_York/" /etc/php/7.4/fpm/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=128/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=1/" /etc/php/7.4/fpm/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/7.4/fpm/php.ini
sed -i '$aapc.enable_cli=1' /etc/php/7.4/mods-available/apcu.ini
sed -i "s/rights=\"none\" pattern=\"PS\"/rights=\"read|write\" pattern=\"PS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"EPS\"/rights=\"read|write\" pattern=\"EPS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"PDF\"/rights=\"read|write\" pattern=\"PDF\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"XPS\"/rights=\"read|write\" pattern=\"XPS\"/" /etc/ImageMagick-6/policy.xml

Ahora reinicie ambos servicios, nginx y PHP:

service php7.4-fpm restart
service nginx restart

Además, PHP ya está instalado y optimizado para Nextcloud. Para más optimizaciones de PHP, puede encontrar más opciones de ajuste en este artículo. Comencemos con la instalación y configuración del servidor de bases de datos MariaDB.

3. Instalación y configuración de MariaDB 10.5

La instalación de MariaDB se realiza con este comando:

apt update && apt install mariadb-server -y

Vamos a endurecer el servidor de base de datos utilizando la herramienta suministrada “mysql_secure_installation”. Cuando se instala por primera vez, no hay contraseña de root, por lo que se puede confirmar la consulta con ENTER. Se recomienda establecer una contraseña directamente, el diálogo correspondiente aparece automáticamente:

mysql_secure_installation
Enter current password for root (enter for none): <ENTER> or type the password
Switch to unix_socket authentication [Y/n] Y
Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Ahora detenga el servidor de la base de datos y guarde la configuración estándar para poder hacer ajustes inmediatamente después:

service mysql stop
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
nano /etc/mysql/my.cnf

Copie todas las líneas siguientes en el archivo vacío:

[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
bulk_insert_buffer_size = 16M
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
concurrent_insert = 2
connect_timeout = 5
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
general_log = 0
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 4000
innodb_flush_method = O_DIRECT
key_buffer_size = 128M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_allowed_packet = 16M
max_binlog_size = 100M
max_connections = 200
max_heap_table_size = 64M
myisam_recover_options = BACKUP
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 2M
query_cache_size = 64M
query_cache_type = 1
query_cache_min_res_unit = 2k
read_buffer_size = 2M
read_rnd_buffer_size = 1M
skip-external-locking
skip-name-resolve
slow_query_log_file = /var/log/mysql/mariadb-slow.log
slow-query-log = 1
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 4M
table_open_cache = 400
thread_cache_size = 128
tmp_table_size = 64M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
#unix_socket=OFF
user = mysql
wait_timeout = 600
[mysqldump]
max_allowed_packet = 16M
quick
quote-names
[isamchk]
key_buffer = 16M

Guarda y cierra el archivo, luego reinicia el servidor de la base de datos para configurar la base de datos Nextcloud, el usuario Nextcloud y su contraseña:

service mysql restart
mysql -uroot -p

Explicación:

Nombre de la base de datos: nextcloud

Usuario de la base de datos: nextcloud

Contraseña del usuario de la base de datos: nextcloud

CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextcloud@localhost identified by 'nextcloud'; GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost; FLUSH privileges; quit;

Compruebe que el nivel de aislamiento (read commit) y el conjunto de caracteres (utf8mb4) están configurados correctamente:

mysql -h localhost -uroot -p -e "SELECT @@TX_ISOLATION; SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='nextcloud'"

Si la salida (resultset) muestra “READ-COMMITTED” y “utf8mb4_general_ci” todo se ha configurado correctamente y podemos proceder a la instalación de Redis.

4. instalación y configuración de Redis

Instalamos el servidor Redis para aumentar el rendimiento de Nextcloud, porque Redis reduce la carga de la base de datos MariaDB Nextcloud:

apt update && apt install redis-server php7.4-redis -y

Ajuste la redistribución guardando y ajustando la configuración ejecutando los siguientes comandos:

cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sed -i "s/port 6379/port 0/" /etc/redis/redis.conf
sed -i s/\#\ unixsocket/\unixsocket/g /etc/redis/redis.conf
sed -i "s/unixsocketperm 700/unixsocketperm 770/" /etc/redis/redis.conf
sed -i "s/# maxclients 10000/maxclients 512/" /etc/redis/redis.conf
usermod -aG redis www-data
cp /etc/sysctl.conf /etc/sysctl.conf.bak
sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf

Por experiencia suficiente en la instalación, te recomiendo que reinicies todo el servidor una vez:

reboot now

En hora buena, el servidor ya está instalado y configurado, así que ahora puedes empezar a configurar Nextcloud.

5. instalación y optimización de Nextcloud (incl. SSL)

Ahora configuramos diferentes vhost, archivos de configuración del servidor y modificamos el archivo vhost por defecto de forma persistente. Como el sistema se reinició antes, cambiamos al modo de usuario privilegiado de nuevo, guardamos el archivo vhost por defecto llamado default.conf y creamos archivos vhost vacíos para configurar.

sudo -s
[ -f /etc/nginx/conf.d/default.conf ] && mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
touch /etc/nginx/conf.d/default.conf
touch /etc/nginx/conf.d/http.conf
touch /etc/nginx/conf.d/nextcloud.conf

Así, el archivo “default.conf” vacío garantiza que esta configuración por defecto no afecte al funcionamiento de Nextcloud aunque el servidor web se actualice posteriormente.

Cree el archivo global vhost para redirigir permanentemente las peticiones http por defecto a https y también habilite la comunicación del certificado SSL con Let’sEncrypt.

nano /etc/nginx/conf.d/http.conf

Copie todas las líneas siguientes en el archivo http.conf y ajuste los valores marcados en rojo según su sistema:

upstream php-handler {
server unix:/run/php/php7.4-fpm.sock;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name ihre.domain.de;
root /var/www;
location ^~ /.well-known/acme-challenge {
default_type text/plain;
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}

Guarde y cierre este archivo. Ahora edita el archivo Nextcloud vHost real nextcloud.conf, que contiene todas las configuraciones para el funcionamiento de Nextcloud.

nano /etc/nginx/conf.d/nextcloud.conf

Copie todas las líneas siguientes en el archivo nextcloud.conf y ajuste los valores resaltados en rojo según su sistema:

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ihre.domain.de;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_trusted_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
#ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem;
#ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384';
ssl_ecdh_curve X448:secp521r1:secp384r1; 
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
fastcgi_hide_header X-Powered-By;
fastcgi_read_timeout 3600;
fastcgi_send_timeout 3600;
fastcgi_connect_timeout 3600;
root /var/www/nextcloud;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location = /.well-known/carddav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
client_max_body_size 10240M;
fastcgi_buffers 64 4K;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
location / {
rewrite ^ /index.php;
}
location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
deny all;
}
location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location ^~ /apps/rainloop/app/data {
deny all;
}
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
try_files $uri/ =404;
index index.php;
}
location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463";
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
try_files $uri /index.php$request_uri;
access_log off;
}
}

Guarde y cierre este archivo y, a continuación, amplíe la seguridad del servidor y del sistema activando el intercambio seguro de claves mediante una clave Diffie-Hellman (dhparam.pem):

openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Por favor, tenga paciencia. La generación puede tardar – dependiendo del rendimiento del sistema – unos minutos. Sólo cuando la generación se ha completado, iniciamos de nuevo el servidor web.

service nginx restart

Ahora comenzamos la instalación “real” del software Nextcloud y configuramos los certificados SSL de Let’s Encrypt usando acme. Para ello, cambie al directorio de trabajo

cd /usr/local/src

y descargar la última versión de Nextcloud:

wget https://download.nextcloud.com/server/releases/latest.tar.bz2
wget https://download.nextcloud.com/server/releases/latest.tar.bz2.md5

Comprueba los archivos:

md5sum -c latest.tar.bz2.md5 < latest.tar.bz2

Sólo si la prueba se confirma con “OK”, continuaremos.

como instalar nextcloud 20

Descomprime el software Nextcloud en el directorio web (var/www), luego establece el permiso adecuadamente y elimina el archivo de descarga:

tar -xjf latest.tar.bz2 -C /var/www && chown -R www-data:www-data /var/www/ && rm -f latest.tar.bz2

Asegúrese de que se puede acceder a su servidor desde el exterior a través del puerto 80/TCP y del puerto 443/TCP. La creación y actualización de los certificados Let’s Encrypt es obligatoria a través de http y del puerto 80. Para el manejo de los certificados ahora creamos un usuario dedicado y lo añadimos al grupo www-data:

adduser --disabled-login acmeuser
usermod -a -G www-data acmeuser

Seguimos dando a este usuario técnico los permisos necesarios para poder iniciar el arranque necesario del servidor web en caso de renovación del certificado.

visudo

En el medio del archivo, abajo

[..]
User privilege specification
root ALL=(ALL:ALL) ALL
[...]

introduzca la siguiente línea:

acmeuser ALL=NOPASSWD: /bin/systemctl reload nginx.service
como instalar nextcloud 20

Con CTRL+X seguido de una y guarda y sale de este archivo.

Cambie al shell del nuevo usuario (acmeuser) para instalar el software del certificado y abandone este shell después:

su - acmeuser
curl https://get.acme.sh | sh
exit

Ajuste los permisos adecuados para poder almacenar los nuevos certificados en él:

chmod -R 775 /var/www/letsencrypt /etc/letsencrypt && chown -R www-data:www-data /var/www/ /etc/letsencrypt

Volver a cambiar al shell del nuevo usuario

su - acmeuser

y pedir (solicitar) los certificados SSL. Sustituya su.dominio.de por su dominio :

acme.sh --issue -d ihre.domain.de --keylength 4096 -w /var/www/letsencrypt --key-file /etc/letsencrypt/rsa-certs/privkey.pem --ca-file /etc/letsencrypt/rsa-certs/chain.pem --cert-file /etc/letsencrypt/rsa-certs/cert.pem --fullchain-file /etc/letsencrypt/rsa-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
acme.sh --issue -d ihre.domain.de --keylength ec-384 -w /var/www/letsencrypt --key-file /etc/letsencrypt/ecc-certs/privkey.pem --ca-file /etc/letsencrypt/ecc-certs/chain.pem --cert-file /etc/letsencrypt/ecc-certs/cert.pem --fullchain-file /etc/letsencrypt/ecc-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"

Salir del shell del nuevo usuario

exit

y luego crear un script que compruebe y corrija los permisos en el futuro (permissions.sh):

nano /root/permissions.sh

Copie todas las líneas en el archivo:

#!/bin/bash
find /var/www/ -type f -print0 | xargs -0 chmod 0640
find /var/www/ -type d -print0 | xargs -0 chmod 0750
chmod -R 775 /var/www/letsencrypt /etc/letsencrypt 
chown -R www-data:www-data /var/www /etc/letsencrypt
chown -R www-data:www-data /var/nc_data
chmod 0644 /var/www/nextcloud/.htaccess
chmod 0644 /var/www/nextcloud/.user.ini
exit 0

Marque el script como ejecutable y luego ejecútelo directamente:

chmod +x /root/permissions.sh
/root/permissions.sh

Elimine de nginx los certificados autofirmados utilizados anteriormente y active los nuevos certificados SSL totalmente válidos de Let’s Encrypt que ya son válidos. A continuación, reinicie el servidor web:

sed -i '/ssl-cert-snakeoil/d' /etc/nginx/conf.d/nextcloud.conf
sed -i s/#\ssl/\ssl/g /etc/nginx/conf.d/nextcloud.conf
service nginx restart

Para renovar los certificados SSL automáticamente, así como para iniciar el reinicio necesario del servidor web, se creó automáticamente una tarea cron.

crontab -l -u acmeuser

Ahora podemos proceder a la configuración de Nextcloud. Para ello, utilice el siguiente comando de instalación “silenciosa”:

sudo -u www-data php /var/www/nextcloud/occ maintenance:install --database "mysql" --database-name "nextcloud" --database-user "nextcloud" --database-pass "nextcloud" --admin-user "YourNextcloudAdmin" --admin-pass "YourNextcloudAdminPasssword" --data-dir "/var/nc_data"

Explicaciones:

database-name “nextcloud” : nombre de la base de datos del capítulo 3.

usuario de base de datos “nextcloud” : usuario de base de datos del capítulo 3

database-pass “nextcloud” : contraseña del usuario de la base de datos del capítulo 3

admin-user “YourNextcloudAdmin” : libremente seleccionable por usted

admin-pass “YourNextcloudAdminPasssword” : libremente seleccionable por usted

Espera a que la instalación de Nextcloud esté completa y luego personaliza el archivo de configuración central de Nextcloud “config.php” como el usuario web www-data:

1. Añada su dominio como dominio de confianza, añada su dominio .de con su dominio dedicado:

sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 0 --value=ihre.domain.de

2. configure su dominio como overwrite.cli.url, añadiendo su.dominio.de con su dominio dedicado:

sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://ihre.domain.de

Ahora, finalmente, ampliamos la configuración de Nextcloud. Primero guarde el config.php existente y luego ejecute las siguientes líneas en un bloque:

sudo -u www-data cp /var/www/nextcloud/config/config.php /var/www/nextcloud/config/config.php.bak
sudo -u www-data sed -i 's/^[ ]*//' /var/www/nextcloud/config/config.php
sudo -u www-data sed -i '/);/d' /var/www/nextcloud/config/config.php
sudo -u www-data cat <<EOF >>/var/www/nextcloud/config/config.php
'activity_expire_days' => 14,
'auth.bruteforce.protection.enabled' => true,
'blacklisted_files' => 
array (
0 => '.htaccess',
1 => 'Thumbs.db',
2 => 'thumbs.db',
),
'cron_log' => true,
'enable_previews' => true,
'enabledPreviewProviders' => 
array (
0 => 'OC\Preview\PNG',
1 => 'OC\Preview\JPEG',
2 => 'OC\Preview\GIF',
3 => 'OC\Preview\BMP',
4 => 'OC\Preview\XBitmap',
5 => 'OC\Preview\Movie',
6 => 'OC\Preview\PDF',
7 => 'OC\Preview\MP3',
8 => 'OC\Preview\TXT',
9 => 'OC\Preview\MarkDown',
),
'filesystem_check_changes' => 0,
'filelocking.enabled' => 'true',
'htaccess.RewriteBase' => '/',
'integrity.check.disabled' => false,
'knowledgebaseenabled' => false,
'logfile' => '/var/nc_data/nextcloud.log',
'loglevel' => 2,
'logtimezone' => 'Europe/Berlin',
'log_rotate_size' => 104857600,
'maintenance' => false,
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'overwriteprotocol' => 'https',
'preview_max_x' => 1024,
'preview_max_y' => 768,
'preview_max_scale_factor' => 1,
'redis' => 
array (
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
'timeout' => 0.0,
),
'quota_include_external_storage' => false,
'share_folder' => '/Shares',
'skeletondirectory' => '',
'theme' => '',
'trashbin_retention_obligation' => 'auto, 7',
'updater.release.channel' => 'stable',
);
EOF

Modificar el archivo “.user.ini”

sudo -u www-data sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini

y pasar las aplicaciones de Nextcloud como usuario www-data a

sudo -u www-data php /var/www/nextcloud/occ app:disable survey_client
sudo -u www-data php /var/www/nextcloud/occ app:disable firstrunwizard
sudo -u www-data php /var/www/nextcloud/occ app:enable admin_audit
sudo -u www-data php /var/www/nextcloud/occ app:enable files_pdfviewer

Nextcloud ya está totalmente operativo, optimizado y protegido. Reinicie todos los servicios relevantes:

service nginx stop
service php7.4-fpm stop
service mysql restart
service php7.4-fpm restart
service redis-server restart
service nginx restart

Configure un cronjob para Nextcloud como usuario “www-data”:

crontab -u www-data -e

Inserte esta línea

*/5 * * * * php -f /var/www/nextcloud/cron.php > /dev/null 2>&1

A continuación, guarde y cierre el archivo y reconfigure el trabajo de Nextcloud de “Ajax” a “Cron” utilizando la CLI de Nextclouds:

sudo -u www-data php /var/www/nextcloud/occ background:cron

6. endurecimiento (fail2ban y ufw)

Primero instalamos fail2ban para proteger el servidor contra los ataques de fuerza bruta y los intentos de inicio de sesión incorrectos:

apt update && apt install fail2ban -y

Cree un nuevo archivo de filtro y rellénelo como se describe a continuación.

touch /etc/fail2ban/filter.d/nextcloud.conf

Copie todo desde “cat …” hasta “… EOF” en su portapapeles y luego péguelo en el shell:

cat <<EOF >/etc/fail2ban/filter.d/nextcloud.conf
[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
            ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
EOF

Confirme con <ENTER> para llenar el archivo. El resultado será el siguiente:

cat /etc/fail2ban/filter.d/nextcloud.conf

Ahora crea un nuevo archivo jail

nano /etc/fail2ban/jail.d/nextcloud.local

Copie todas las líneas siguientes en él:

[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 5
bantime = 3600
findtime = 36000
logpath = /var/nc_data/nextcloud.log

Con los parámetros mostrados anteriormente, después de 5 intentos fallidos de inicio de sesión (maxretry) en los últimos 36000 segundos (findtime, que equivale a 10h), la IP del potencial atacante será bloqueada durante un periodo de 3600 segundos (bantime, que equivale a 1h).

Reinicie fail2ban y compruebe el estado de fail2ban:

service fail2ban restart
fail2ban-client status nextcloud

A partir de ahora, las direcciones IP que hayan realizado 5 o más intentos fallidos de inicio de sesión en las últimas 10 horas serán bloqueadas durante 1 hora, protegiendo su servidor de nuevos ataques. Si quieres probar el bloqueo manualmente y desbloquear el bloqueo resultante de tu IP o de las IPs ya bloqueadas, ejecuta primero este comando,

fail2ban-client status nextcloud

para mostrar las direcciones IP bloqueadas. Puede desbloquear la(s) IP(s) mostrada(s) utilizando el siguiente comando:

fail2ban-client set nextcloud unbanip <ip-adresse>

Por último, instalamos un firewall, el llamado firewall sin complicaciones (ufw):

Si has cambiado el puerto SSH de 22 a otro puerto antes, tienes que reemplazar el 22 en consecuencia.

apt install ufw -y
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 22/tcp

Si no quieres compartir SSH externamente (¡recomendado!) y sólo quieres usarlo desde la red interna, sustituye el último comando ufw (ufw allow 22/tcp) por éste:

ufw allow proto tcp from 192.168.2.0/24 to any port 22

Sustituya la red de ejemplo (192.168.2.0/24) por la red que esté utilizando.

Configure el registro del cortafuegos en “medio” y evite las conexiones entrantes no definidas.

ufw logging medium
ufw default deny incoming

Active el cortafuegos y reinícielo:

ufw enable
service ufw restart

7. Optimizar y actualizar el Nextcloud mediante un script

Crear un script para actualizar y optimizar el Nextcloud y las aplicaciones activadas:

 

cd /root
nano upgrade.sh
#!/bin/bash
/usr/sbin/service nginx stop
sudo -u www-data php /var/www/nextcloud/updater/updater.phar
sudo -u www-data php /var/www/nextcloud/occ status
sudo -u www-data php /var/www/nextcloud/occ -V
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-primary-keys
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-columns
sudo -u www-data php /var/www/nextcloud/occ db:convert-filecache-bigint
sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini
chown -R www-data:www-data /var/www/nextcloud
redis-cli -s /var/run/redis/redis-server.sock <<EOF
FLUSHALL
quit
EOF
sudo -u www-data php /var/www/nextcloud/occ files:scan --all
sudo -u www-data php /var/www/nextcloud/occ files:scan-app-data
sudo -u www-data php /var/www/nextcloud/occ app:update --all
/usr/sbin/service php7.4-fpm restart
/usr/sbin/service nginx restart
exit 0

Marque el script como ejecutable y ejecútelo regularmente como usuario con privilegios.

chmod +x /root/upgrade.sh
/root/upgrade.sh

La instalación y el aseguramiento de su Nextcloud Server se ha completado con éxito, por lo que le deseo mucha diversión con sus datos en su nube privada. Si quieres probar antes de atreverte hacer esta instalación, puedes registrarte para que crear una cuenta en: https://tunube.ga, para mas información sobre nuestros servicios haz click al: https://easyvhost.com o https://consultasinformaticas.com

Open chat