Nextcloud unter CentOS 7.x installieren und betreiben
Mit Hilfe von Nextcloud kann man einen sicheren Datenraum z.B. auf eigenen Servern für seine Nutzer bereitstellen, so dass diese ihre vertraulichen Daten nicht bei einem der diversen Cloud-Dienste nutzen müssen.
Nextcloud wurde vom Owncloud-Gründer Frank Karlitschek zusammen mit ehemaligen Owncloud-Developern als fork der aktuellen Owncloud-Version 9 ins Leben gerufen. Im Gegensatz zum ursprünglichen Projekt Owncloud soll die Weiterentwicklung des forks alle Funktionen des bisherigen Projekts beinhalten, inklusive der kostenpflichtigen Enterprise-Features von Owncloud.
Dokumentation
Eine ausführliche Dokumentation findet sich in der Nextcloud Server Administration Manual Release 13.
vorbereitende Konfiguration
SQL-Datenbank MariaDB
Bei unserer Nextcloud-Installation wollen wir als Datenbank unsere MariaDB verwenden. Eine ausführliche Installation und Konfigurationsbeschreibung ist hier zu finden.
Als erstes legen wir uns eine Datenbank nextcloud_db an. Anschließend legen wir uns eine zugehörigen Datenbanknutzer an und weisen ihm die erforderlichen Rechte zu.
# mysql -h localhost -u root -p
Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 73466 Server version: 5.5.47-MariaDB MariaDB Server Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> create database nextcloud_db; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> CREATE USER 'nextcloud_user'@'10.0.0.97' IDENTIFIED BY '/rb6(gKjabjz5sHdszwh2pc97dsnmdo364nf\'; Query OK, 0 rows affected (0.18 sec) MariaDB [(none)]> CREATE USER 'nextcloud_user'@'vml000097.dmz.nausch.org' IDENTIFIED BY '/rb6(gKjabjz5sHdszwh2pc97dsnmdo364nf\'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud_user'@'10.0.0.97' IDENTIFIED BY '/rb6(gKjabjz5sHdszwh2pc97dsnmdo364nf\' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud_user'@'vml000097.dmz.nausch.org' IDENTIFIED BY '/rb6(gKjabjz5sHdszwh2pc97dsnmdo364nf\' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.05 sec) MariaDB [(none)]> exit Bye
Download
Bevor wir uns das aktuelle Programmpaket von nextcloud herunterladen, wechseln wir in unser lokales Paketverzeichnis.
# cd /usr/local/src/packages/
Anschliessend holen wir uns das aktuelle tar.bz2-Archiv und dessen zugehörige sha512 Prüfsumme auf unseren Server.
# wget https://download.nextcloud.com/server/releases/nextcloud-13.0.4.tar.bz2 # wget https://download.nextcloud.com/server/releases/nextcloud-13.0.4.tar.bz2.sha512
Vom heruntergeladenen Archiv nextcloud-13.0.4.tar.bz2 generieren wir einen eigenen Hash-Wert und legen diesen in einer lokalen Datei ab.
# sha512sum nextcloud-13.0.4.tar.bz2 > nextcloud-13.0.4.tar.bz2.sha512.local
Nun können wir die beiden Hash-Werte vergleichen und somit prüfen, ob dem Archiv soweit vertraut werden kann.
# diff nextcloud-13.0.4.tar.bz2.sha512.local nextcloud-13.0.4.tar.bz2.sha512
Sind beide Werte identisch, erfolgt keine Ausgabe - wir können also mit der Installation und Konfiguration fortschreiten.
Entpacken
Nun entpacken wir das heruntergeladene tar.bz2-Archiv an Ort und Stelle.
# tar -jxpvf nextcloud-13.0.4.tar.bz2 -C /srv/www/html/
Berechtigungen anpassen
Anschliessend passen wir die Berechtigungen des Verzeichnisses /srv/www/html/nextcloud an, so dass unser Apache-User unter dem der HTTP-Daemon läuft darauf zugreifen kann.
# chown -R apache:apache /srv/www/html/nextcloud
Apache vHost
Als Webserver nutzen wir unseren Apache-Webserver 2.4, dessen Installation und Konfiguration ist in diesem Kapitel beschrieben. Zur Absicherung des Web-Traffic kommt selbstredend TLS zum Einsatz. Die Installation und Konfiguration hierzu findet sich im Kapitel SSL gesicherter Webserver mit mod_ssl für Apache httpd 2.4 unter CentOS 7.x.
Für unseren virtuellen Host legen wir uns nun noch eine passende Konfigurationsdatei an:
# cat /etc/httpd/conf.d/nextcloud.conf
- /etc/httpd/conf.d/nextcloud.conf
# # Django : 2016-07-29 # vHost cloud.nausch.org (nextcloud) # <VirtualHost 10.0.0.97:80> ServerAdmin webmaster@nausch.org ServerName cloud.nausch.org RewriteEngine on RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} # Welche Logdateien sollen beschrieben werden SetEnvIf Remote_Addr "10\.0\.0\.20" dontlog CustomLog logs/nextcloud_access.log combined ErrorLog logs/nextcloud_error.log </VirtualHost> <VirtualHost 10.0.0.97:443> ServerAdmin webmaster@nausch.org ServerName cloud.nausch.org ServerPath / # URL Vereinfachung RedirectMatch ^/*$ https://cloud.nausch.org/nextcloud/ # Wer soll Zugriff auf die Webseite(n) bekommen? <Location /> Options -Indexes +FollowSymLinks Require all granted </Location> # Welcher Inhalt soll angezeigt bzw. auf welchen Server sollen die HTTP-Requests weitergeleitet werden? <Directory "/srv/www/html/nextcloud"> Options FollowSymLinks AllowOverride none Require all granted </Directory> <LocationMatch "/(data|config)/"> Require all denied </LocationMatch> # Link für DAV-Support Redirect 301 /.well-known/carddav /remote.php/dav Redirect 301 /.well-known/caldav /remote.php/dav # Welche Logdateien sollen beschrieben werden SetEnvIf Remote_Addr "10\.0\.0\.20" dontlog CustomLog logs/nextcloud_access.log combined ErrorLog logs/nextcloud_error.log # Absicherung der Übertragung mit Hilfe von TLS # Konfiguration bei Verwendung von mod_gnutls <IfModule !mod_ssl.c> <IfModule mod_gnutls.c> # Django : 2015-10-29 - TLS-Verschlüsselung mit Hilfe von mod_gnutls GnuTLSEnable on # Definition der anzubietenden Protokolle und Ciphers GnuTLSPriorities PFS:-VERS-TLS-ALL:+VERS-TLS1.2:-ARCFOUR-128:+COMP-NULL:+CURVE-SECP384R1:+CURVE-SECP521R1 # Schlüsseldatei, mit der der CSR erstellt wurde GnuTLSKeyFile /etc/pki/tls/private/lists.nausch.org.serverkey.pem # Zertifikatsdatei inkl. ggf. notwendiger Zwischen- und Root-Zertifikaten # 1) Server-Zertifikat, 2) Intermediate-Root-Zertifikat und 3) Root-Zertifikat der CA GnuTLSCertificateFile /etc/pki/tls/certs/lists.nausch.org.certificatechain_151019.pem # Definition der Schlüssellänge für DHE und ECDHE # DHE Schlüssel mit einer Schlüssellänge von 4096 Bit verwenden; dieser wird 1x pro Tag via cronjob # (/etc/cron.daily/edh_keygen) neu generiert und der Neustart des nginx-Daemon veranlasst! GnuTLSDHFile /etc/pki/tls/private/dh_4096.pem # Session-Tickets für Clients nicht anbieten (dieser könnte versuchen über Tickets die Session zu cachen). GnuTLSSessionTickets off </IfModule> </IfModule> # Konfiguration bei Verwendung von mod_ssl <IfModule mod_ssl.c> <IfModule !mod_gnutls.c> # Django : 2015-10-04 - TLS-Verschlüsselung mit Hilfe von mod_ssl SSLEngine on # Definition der anzubietenden Protokolle SSLProtocol All -SSLv2 -SSLv3 # Definition der Cipher #SSLCipherSuite "AES256+EECDH +AEAD" SSLCipherSuite DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXP:!MD5:!DSS:!LOW # Schlüsseldatei, mit der der CSR erstellt wurde SSLCertificateKeyFile /etc/pki/tls/private/cloud.nausch.org.serverkey.pem # Zertifikatsdatei inkl. ggf. notwendiger Zwischen- und Root-Zertifikaten SSLCertificateFile /etc/pki/tls/certs/cloud.nausch.org.certificate_160801.pem #SSLCertificateChainFile /etc/pki/tls/certs/RapidSSL_certificatechain.pem SSLCertificateChainFile /etc/pki/tls/certs/RapidSSL_SHA256_CA_-_G3.pem # Änderung der Cipherorder der Clienets verneinen SSLHonorCipherOrder on # TLS 1.0 Kompremmierung deaktivieren (CRIME attacks) SSLCompression off # SSLUseStapling on </IfModule> </IfModule> # special stuff ### # HTTP Strict Transport Security (HSTS), bei dem der Server dem Client im HTTP-Header mitteilt, # dass dieser nur noch verschlüsselt mit dem Server kommunizieren soll. Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" # This header enables the Cross-site scripting (XSS) filter built into most recent web browsers. # It's usually enabled by default anyway, so the role of this header is to re-enable the filter for # this particular website if it was disabled by the user. # https://www.owasp.org/index.php/List_of_useful_HTTP_headers Header set X-XSS-Protection "1; mode=block" # when serving user-supplied content, include a X-Content-Type-Options: nosniff header along with the Content-Type: header, # to disable content-type sniffing on some browsers. # https://www.owasp.org/index.php/List_of_useful_HTTP_headers # currently suppoorted in IE > 8 http://blogs.msdn.com/b/ie/archive/2008/09/02/ie8-security-part-vi-beta-2-update.aspx # http://msdn.microsoft.com/en-us/library/ie/gg622941(v=vs.85).aspx # 'soon' on Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=471020 Header set X-Content-Type-Options nosniff # config to don't allow the browser to render the page inside an frame or iframe # and avoid clickjacking http://en.wikipedia.org/wiki/Clickjacking # if you need to allow [i]frames, you can use SAMEORIGIN or even set an uri with ALLOW-FROM uri # https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options header set X-Frame-Options SAMEORIGIN </VirtualHost>
Konfiguration über die WEB-GUI
Die weitere Konfiguration erfolgt dann direkt über die Web-GUI, die wir über unsere URL https://cloud.nausch.org erreichen.
Zunächst definieren wir den Admin-Account und weisen diesem ein passendes sicheres Passwort zu.
Da wir unsere zuvor definierte Maria-DB nutzen wollen, klicken wir auf die Schaltfläche Speicher & Datenbank. Dort tragen wir dann die benötigten Daten ein.
Haben wir alle Daten richtig eingegeben beenden wir die Konfiguration über die Schaltfläche [ Installation abschließen ]. uns wir anschliessend eine Hinweis-Seite zu den zur Verfügung stehenden Clients angezeigt.
Dieses Hinweisfenster beenden wir über das x in der rechten oberen Ecke des eingeblendeten Hinweisfensters und gelangen so zum Hauptfenster von Nextcloud.
Update/Upgrade
Download
Bevor wir uns das aktuelle (Update-)Programmpaket von nextcloud herunterladen, wechseln wir in unser lokales Paketverzeichnis.
# cd /usr/local/src/packages/
Anschließend holen wir uns das aktuelle tar.bz2-Archiv und dessen zugehörige sha512 Prüfsumme auf unseren Server.
# wget https://download.nextcloud.com/server/releases/nextcloud-14.0.4.tar.bz2 # wget https://download.nextcloud.com/server/releases/nextcloud-14.0.4.tar.bz2.sha512
Vom heruntergeladenen Archiv nextcloud-13.0.6.tar.bz2 generieren wir einen eigenen Hash-Wert und legen diesen in einer lokalen Datei ab.
# sha512sum nextcloud-14.0.4.tar.bz2 > nextcloud-14.0.4.tar.bz2.sha512.local
Nun können wir die beiden Hash-Werte vergleichen und somit prüfen, ob dem Archiv soweit vertraut werden kann.
# diff nextcloud-14.0.4.tar.bz2.sha512.local nextcloud-14.0.4.tar.bz2.sha512
Sind beide Werte identisch, erfolgt keine Ausgabe - wir können also nun mit dem Update unserer Installation beginnen.
Webserver anhalten
Bevor wir nun unsere bestehende Installation updaten, versetzen wir erst noch unseren NextCloud-Server in den Wartungsmodus.
# sudo -u apache php /srv/www/html/cloud/occ maintenance:mode --on
Maintenance mode enabled
Optional können wir auch unseren laufenden NextCloud-Webserver. Dazu deaktivieren wir die Konfigurationsdatei unseres Apache-vHosts indem wir diese umbenennen und den Webserver einmal durchstarten.
# mv /etc/httpd/conf.d/3rd_cloud.conf /etc/httpd/conf.d/3rd_cloud.conf.deaktiviert
# systemctl restart httpd.service
bestehendes Installations-Verzeichnis sichern
Nun sichern wir das bestehende Installationsverzeichnis indem wir es umbenennen.
# mv /srv/www/html/nextcloud /srv/www/html/nextcloud.old
# cp -ra /srv/www/html/cloud /srv/www/html/cloud.$(date +%y%m%d)
Entpacken
Nun entpacken wir das heruntergeladene tar.bz2-Archiv an Ort und Stelle.
# tar -jxpvf /usr/local/src/packages/nextcloud-14.0.4.tar.bz2 -C /srv/www/html/
# rm -rf /srv/www/html/cloud && mv /srv/www/html/nextcloud /srv/www/html/cloud
Berechtigungen anpassen
Anschliessend passen wir die Berechtigungen des Verzeichnisses /srv/www/html/cloud an, so dass unser Apache-User unter dem der HTTP-Daemon läuft darauf zugreifen bzw. dort auch hineinschreiben kann.
# chown -R apache:apache /srv/www/html/cloud
Konfiguration erneuern
Die Konfigurationsdatei config.php unserer bestehenden Installation kopieren wir nun in unser neues Updateverzeichnis.
# cp -a /srv/www/html/cloud.$(date +%y%m%d)/config/config.php /srv/www/html/cloud/config/config.php
Datenverzeichnis sichern/kopieren
Haben wir das Datenverzeihnis im Web-ROOT-Verzeichnis unseres Apache-Webservers müssen wir nun noch die Daten zurücksichern. Hierzu kopieren wir den Inhalt der gesichterten NextCloud-Installation in das zuvor neu angelegte Verzeichnis.
# cp -avr /srv/www/html/nextcloud.old/data/ /srv/www/html/nextcloud/data/
Befindet sich das Datrenverzeichnis ausserhalb unseres Web-ROOT-Verzeichnisses brauchen wir nichts unternehmen, da lediglich die Pfadangabe in der Konfigurationsdatei /srv/www/html/nextcloud/config/config.php vermerkt ist und das Datenverzeichnis vom anschliessenden manuellen Update nicht erfasst wird!
Webserver starten
Nun können wir unseren NextCloud-Webserver wieder starten. Dazu aktivieren wir die Konfigurationsdatei unseres Apache-vHosts indem wir diese umbenennen und den Webserver einmal durchstarten.
# mv /etc/httpd/conf.d/nextcloud.conf.deaktiviert /etc/httpd/conf.d/nextcloud.conf
# systemctl restart httpd.service
Da wir nach wie vor unseren NextCloud-Server im Wartungsmodus laufen haben, wird einem Nutzer, der versucht sich an der WEB-GUI anzumelden ein entsprechender Hinweis eingeblendet.
Upgrade starten
Nun starten wir den Upgrade unserer Intsallation. Je nach Grösse und Umfang unserer Installation wir es nun ein Weilchen Dauern bis die Aktualisierung unserer Installation abgeschlossen ist.
# sudo -u apache php /srv/www/html/cloud/occ upgrade
Nextcloud or one of the apps require upgrade - only a limited number of commands are available You may use your browser or the occ upgrade command to do the upgrade Set log level to debug Updating database schema Updated database Disabled incompatible app: admin_notifications Disabled incompatible app: announcementcenter Disabled incompatible app: apporder Disabled incompatible app: audioplayer Disabled incompatible app: bookmarks Disabled incompatible app: bruteforcesettings Disabled incompatible app: calendar Disabled incompatible app: caniupdate Disabled incompatible app: circles Disabled incompatible app: contacts Disabled incompatible app: deck Disabled incompatible app: defaultlinkopen Disabled incompatible app: drop_account Disabled incompatible app: end_to_end_encryption Disabled incompatible app: external Disabled incompatible app: files_downloadactivity Disabled incompatible app: files_retention Disabled incompatible app: files_rightclick Disabled incompatible app: flowupload Disabled incompatible app: mail Disabled incompatible app: mindmaps Disabled incompatible app: mood Disabled incompatible app: news Disabled incompatible app: notes Disabled incompatible app: polls Disabled incompatible app: previewgenerator Disabled incompatible app: quota_warning Disabled incompatible app: radio Disabled incompatible app: ransomware_protection Disabled incompatible app: sharerenamer Disabled incompatible app: socialsharing_email Disabled incompatible app: spreed Disabled incompatible app: tasks Disabled incompatible app: twofactor_u2f Updating <federatedfilesharing> ... Updated <federatedfilesharing> to 1.4.0 Updating <files_pdfviewer> ... Updated <files_pdfviewer> to 1.3.2 Updating <files_texteditor> ... Updated <files_texteditor> to 2.6.0 Updating <files_videoplayer> ... Updated <files_videoplayer> to 1.3.0 Updating <gallery> ... Updated <gallery> to 18.1.0 Updating <password_policy> ... Updated <password_policy> to 1.4.0 Updating <provisioning_api> ... Updated <provisioning_api> to 1.4.0 Updating <serverinfo> ... Updated <serverinfo> to 1.4.0 Updating <survey_client> ... Updated <survey_client> to 1.2.0 Updating <twofactor_backupcodes> ... Updated <twofactor_backupcodes> to 1.3.1 Updating <updatenotification> ... Updated <updatenotification> to 1.4.1 Updating <federation> ... Updated <federation> to 1.4.0 Updating <lookup_server_connector> ... Updated <lookup_server_connector> to 1.2.0 Updating <oauth2> ... Updated <oauth2> to 1.2.1 Updating <files> ... Updated <files> to 1.9.0 Updating <activity> ... Updated <activity> to 2.7.0 Updating <dav> ... Fix broken values of calendar objects Done 0/0 [>---------------------------] 0% Updatedto 1.6.0 Updating <files_sharing> ... Updated <files_sharing> to 1.6.2 Updating <files_trashbin> ... Updated <files_trashbin> to 1.4.1 Updating <files_versions> ... Updated <files_versions> to 1.7.1 Updating <sharebymail> ... Updated <sharebymail> to 1.4.0 Updating <workflowengine> ... Updated <workflowengine> to 1.4.0 Updating <comments> ... Updated <comments> to 1.4.0 Updating <firstrunwizard> ... Updated <firstrunwizard> to 2.3.0 Updating <nextcloud_announcements> ... Updated <nextcloud_announcements> to 1.3.0 Updating <notifications> ... Updated <notifications> to 2.2.1 Updating <systemtags> ... Updated <systemtags> to 1.4.0 Updating <theming> ... Updated <theming> to 1.5.0 Checking for update of app activity in appstore Checked for update of app "activity" in appstore Checking for update of app cloud_federation_api in appstore Checked for update of app "cloud_federation_api" in appstore Checking for update of app comments in appstore Checked for update of app "comments" in appstore Checking for update of app dav in appstore Checked for update of app "dav" in appstore Checking for update of app federatedfilesharing in appstore Checked for update of app "federatedfilesharing" in appstore Checking for update of app federation in appstore Checked for update of app "federation" in appstore Checking for update of app files in appstore Checked for update of app "files" in appstore Checking for update of app files_pdfviewer in appstore Checked for update of app "files_pdfviewer" in appstore Checking for update of app files_sharing in appstore Checked for update of app "files_sharing" in appstore Checking for update of app files_texteditor in appstore Checked for update of app "files_texteditor" in appstore Checking for update of app files_trashbin in appstore Checked for update of app "files_trashbin" in appstore Checking for update of app files_versions in appstore Checked for update of app "files_versions" in appstore Checking for update of app files_videoplayer in appstore Checked for update of app "files_videoplayer" in appstore Checking for update of app firstrunwizard in appstore Checked for update of app "firstrunwizard" in appstore Checking for update of app gallery in appstore Checked for update of app "gallery" in appstore Checking for update of app logreader in appstore Checked for update of app "logreader" in appstore Checking for update of app lookup_server_connector in appstore Checked for update of app "lookup_server_connector" in appstore Checking for update of app nextcloud_announcements in appstore Checked for update of app "nextcloud_announcements" in appstore Checking for update of app notifications in appstore Checked for update of app "notifications" in appstore Checking for update of app oauth2 in appstore Checked for update of app "oauth2" in appstore Checking for update of app password_policy in appstore Checked for update of app "password_policy" in appstore Checking for update of app provisioning_api in appstore Checked for update of app "provisioning_api" in appstore Checking for update of app serverinfo in appstore Checked for update of app "serverinfo" in appstore Checking for update of app sharebymail in appstore Checked for update of app "sharebymail" in appstore Checking for update of app survey_client in appstore Checked for update of app "survey_client" in appstore Checking for update of app systemtags in appstore Checked for update of app "systemtags" in appstore Checking for update of app theming in appstore Checked for update of app "theming" in appstore Checking for update of app twofactor_backupcodes in appstore Checked for update of app "twofactor_backupcodes" in appstore Checking for update of app updatenotification in appstore Checked for update of app "updatenotification" in appstore Checking for update of app workflowengine in appstore Checked for update of app "workflowengine" in appstore Starting code integrity check... Finished code integrity check Update successful Maintenance mode is kept active Reset log level
Da der Upgrade nun erfolgreich abgeschlossen ist, können wir den Wartungsmodus unserer NextCloud-Installation wieder beenden.
# sudo -u apache php /srv/www/html/nextcloud/occ maintenance:mode --off
Nextcloud is in maintenance mode - no app have been loaded Maintenance mode disabled
Nun können wir uns nun an der WEB-GUI unserer NextCloud-Instanz wieder anmelden und überprüfen die Funktionen.
Am besten werfen wir dazu auch einmal einen Blick in die Systeminformationen als User Admin. So wird z.B. beim Update von Version 13 auf 14 Hinweise zur Anpassungen der Datenbank gegeben!
So erzeugen wir wie angeraten die fehlenden Indizes.
# sudo -u apache php /srv/www/html/cloud/occ db:add-missing-indices
Check indices of the share table. Adding additional share_with index to the share table, this can take some time... Share table updated successfully. Adding additional parent index to the share table, this can take some time... Share table updated successfully. Adding additional mtime index to the filecache table, this can take some time... Filecache table updated successfully.
Eine erneute Überprüfung zeigt nun, dass alles wieder in Ordnung ist.
Auch ein Test über den angegebenen link zum Nextcloud Security Scanner sollte ein entsprechend aktuelles Ergebnis liefern.