Comment mettre rapidement en place un partage de fichiers http sous GNU/Linux

Lighttpd logo Debian logo

Si on a une bonne connection internet il peut être sympa de pouvoir partager des fichiers avec des amis avec une solution faite maison.

Nous allons voir ici comment mettre en place un serveur web splécialement paramétré pour le partage de fichiers dans un environnement GNU/Linux.

Le but ici est de faire cela rapidement et donc avec un minimum de configuration.

Pour se faire nous utiliserons le logiciel lighttpd qui est un serveur web open source sécurisé, rapide et flexible.

Sa charge CPU est faible tout comme son empreinte mémoire, donc tout ce que l'on cherche.

Installation de lighttpd

  • Installer lighttpd :
root@host:~# apt-get install lighttpd

Éditer le fichier de configuration

  • Éditer le fichier /etc/lighttpd/lighttpd.conf, et ajouter cette ligne :
server.modules = (
        "mod_indexfile",
        "mod_access",
        "mod_alias",
        "mod_redirect",
)

server.dir-listing          = "enable"
server.document-root        = "/var/www/html"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80

# strict parsing and normalization of URL for consistency and security
# https://redmine.lighttpd.net/projects/lighttpd/wiki/Server_http-parseoptsDetails
# (might need to explicitly set "url-path-2f-decode" = "disable"
#  if a specific application is encoding URLs inside url-path)
server.http-parseopts = (
  "header-strict"           => "enable",# default
  "host-strict"             => "enable",# default
  "host-normalize"          => "enable",# default
  "url-normalize-unreserved"=> "enable",# recommended highly
  "url-normalize-required"  => "enable",# recommended
  "url-ctrls-reject"        => "enable",# recommended
  "url-path-2f-decode"      => "enable",# recommended highly (unless breaks app)
 #"url-path-2f-reject"      => "enable",
  "url-path-dotseg-remove"  => "enable",# recommended highly (unless breaks app)
 #"url-path-dotseg-reject"  => "enable",
 #"url-query-20-plus"       => "enable",# consistency in query string
)

index-file.names            = ( "index.php", "index.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.conf.pl"
include "/etc/lighttpd/conf-enabled/*.conf"

#server.compat-module-load   = "disable"
server.modules += (
        "mod_compress",
        "mod_dirlisting",
        "mod_staticfile",
)
  • Créer un répertoire upload :
root@host:~# mkdir /var/www/html/upload
  • Créer un fichier de test :
root@host:~# echo "titi" > /var/www/html/upload/toto
  • Recharger le service lighttpd :
root@host:~# systemctl restart lighttpd.service

Se connecter au serveur web

  • Depuis un navigateur web se connecter à notre serveur web (http://IP_ADDRESS/upload). Depuis la page Index of on devrait voir apparaitre notre fichier :
GNU/Linux | Lighttpd Index of

Comment sécuriser?

Maintenant que notre tout nouveau serveur http est opérationnel et si l'on souhaite le rendre accessible depuis internet (c'est ce qu'on veut non?), il peut être important d'en augmenter la sécurité.

Nous allons voir ici comment améliorer la sécurité de notre serveur.

Règles Pare-feu

Nous pouvons utiliser les pare-feu netfilter/iptables ou nftables afin de restreindre l'accès et de n'autoriser seulement quelques adresses ip.

Netfilter/iptables

root@host:~# iptables -A INPUT -p tcp --dport 80 -m state -s ALLOWED_IP --state NEW,ESTABLISHED,RELATED -j ACCEPT
root@host:~# iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j DROP

nftables rules

root@host:~# nft add rule ip filter INPUT tcp dport 80 ip saddr ALLOWED_IP ct state new,established counter accept
root@host:~# nft add rule ip filter INPUT tcp dport 80 ct state new,established counter drop

Ajouter une demande d'authentification

Nous pouvons également ajouter une demande d'utilisateur/mot de passe pour protéger l'accès au partage.

  • Éditer le fichier /etc/lighttpd/lighttpd.conf, et ajouter les lignes suivantes :
server.modules = (
	"mod_indexfile",
	"mod_access",
	"mod_alias",
 	"mod_redirect",
	"mod_auth"
)

auth.backend = "plain"
auth.backend.plain.userfile = "/etc/lighttpd/lighttpd-plain.user"

auth.require = ( "/" =>
        (
        "method" => "basic",
        "realm" => "Auth",
        "require" => "valid-user"
        )
)
  • Ajouter un nouvel utilisateur de type login:password :
root@host:~# echo "agent007:secret" > /etc/lighttpd/lighttpd-plain.user
  • Redémarrer le service lighttpd :
root@host:~# systemctl restart lighttpd.service
  • A la prochaine connexion une fenêtre d'authentification apparaitra :
GNU/Linux | Lighttpd fenêtre d'authentification.

Ajouter le support https

  • Créer un certificat auto-signé :
root@host:~# openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/ssl/private/lighttpd-selfsigned.key -out /etc/ssl/certs/lighttpd-selfsigned.crt
root@host:~# cat /etc/ssl/private/lighttpd-selfsigned.key /etc/ssl/certs/lighttpd-selfsigned.crt > /etc/lighttpd/cert.pem
  • Lui octroyer les bons droits :
root@host:~# chmod 600 /etc/lighttpd/cert.pem
  • Éditer le fichier /etc/lighttpd/lighttpd.conf, et ajouter les lignes suivantes :
server.modules = (
	"mod_indexfile",
	"mod_access",
	"mod_alias",
 	"mod_redirect",
	"mod_auth",
	"mod_openssl"
)

$SERVER["socket"] == ":443" {
	ssl.engine = "enable"
	ssl.pemfile = "/etc/lighttpd/cert.pem"
}
  • Redémarrer le service lighttpd :
root@host:~# systemctl restart lighttpd.service
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :