quota (brouillon)

repquota -s /var/www : reporting de l’espace utilisé par utilisateur pour le volume /var/www (-s pour les valeurs «human readable» )

edquota michael -f /var/www/ éditer les quotas pour le volume /var/www et l’utilisateur michael

warnquota -d /var/www envoyer un message à ceux qui ont dépassés le quota autorisé (-d pour ne pas afficher le détail)

/etc/warnquota.conf :

MESSAGE   = {MESSAGE}
SIGNATURE = {SIGNATURE}
# MAIL_CMD = "/usr/sbin/sendmail -t"
MAIL_CMD = "/usr/local/sbin/custom-warnquota"
FROM 		= "quota@exemple.fr"
SUBJECT 	= {SUBJECT}

/usr/local/sbin/warnquota-custom:

#!/bin/bash

original=$(cat /dev/stdin)

to=$(echo "$original"|grep '^To: '|sed 's/To: //')

result=${original}
result=$(echo "$result"|sed "s/{SUBJECT}/[quota] quota dépassé pour le site $to/")

message='print "<p>Bonjour,</p>\n";'
message=$message' print "<p>le serveur a détecté que le quota autorisé pour le dossier <b>'$to'</b> a été dépassée.</p>\n";'
message=$message' print "<p>Cela signifie que le système pense que vous utilisez plus d'"'"'espace disque que ce que vous devriez.<br><br>Si les fichiers ne sont pas supprimés avant la «période de grâce», le système empêchera la création de nouveau fichiers. La limite actuelle est à 1Go.</p>";'
message=$message' print "\n<p>Bonne journée,<br><br>Michaël<br>(Ce courriel est généré automatiquement)</p>";'
signature='print "<br>";'

# awk '1;/PATTERN/{ print "add one line"; print "\\and one more"}'
result=$(echo "$result"|awk "1;/{MESSAGE}/{ $message$signature }")

result=$(echo "$result"|sed "s/{MESSAGE}//")
result=$(echo "$result"|sed "s/{SIGNATURE}//")
result=$(echo "$result"|sed "s/Content-Type: text\/plain/Content-Type: text\/html/")

result=$result

echo "$result" | /usr/sbin/sendmail -t

command_return=$?
if [[ "$command_return" -ne 0 ]]; then
  echo "Erreur $command_return: Une erreur est survenue avec la commande sendmail pour les quotas "
  echo "result:"
  echo "$result"
  exit 1
fi

script création dkim

Script pour automatiser la configuration de postfix/DKIM pour un nouveau site à héberger (prérequis: installer dkim et configurer postfix comme ici: https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy )

#!/bin/bash

domain=$1

# «selector» est utilisé pour retrouver l'enregistrement TXT correspondant dans la zone DNS
selector=mail

opendkim_config_path=/etc/opendkim
keys_path=$opendkim_config_path/keys

if [[ -z "$domain" ]]; then
  echo "1er argument (domaine) manquant"
  exit 1
fi

if [[ ! "$domain" =~ ^[a-z_A-Z-]+\.[a-zA-Z]{2,4}$ ]]; then
  echo "domaine '$domain' incorrect"
  exit 2
fi


if [[ -d $keys_path/$domain ]]; then
  echo "dossier '$domain' existe déjà dans $keys_path"
  exit 3
fi

file_trusted_host=$opendkim_config_path/TrustedHosts
file_signing_table=$opendkim_config_path/SigningTable
file_key_table=$opendkim_config_path/KeyTable

if grep "$domain" $file_trusted_host; then
  echo "Le domaine '$domain' existe déjà dans $file_trusted_host"
  exit 4
fi

if grep "$domain" $file_signing_table; then
  echo "Le domaine '$domain' existe déjà dans $file_signing_table"
  exit 5
fi

if grep "$domain" $file_key_table; then
  echo "Le domaine '$domain' existe déjà dans $file_key_table"
  exit 6
fi

keyTableString="$selector._domainkey.$domain $domain:$selector:/etc/opendkim/keys/$domain/$selector.private"
signingTableString="*@$domain $selector._domainkey.$domain"
trustedHostString="*.$domain"

echo $trustedHostString >> $file_trusted_host
echo $signingTableString >> $file_signing_table
echo $keyTableString >> $file_key_table

mkdir $keys_path/$domain
cd $keys_path/$domain
opendkim-genkey -s $selector -d $domain
chown opendkim:opendkim $selector.private

cd $opendkim_config_path
chown opendkim:opendkim $keys_path/$domain

echo "Ajouter la clé publique à la zone DNS"
echo "-----"
cat $keys_path/$domain/$selector.txt
echo "-----"

systemctl restart postfix
systemctl restart opendkim

echo "Commande pour tester:"
echo -----
random_email_dkimvalidator=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 19 | head -n 1)@dkimvalidator.com
echo "test |mail -a 'From: root@$domain' -s 'test dkim pour $domain' $random_email_dkimvalidator"
echo "et vérifier: https://dkimvalidator.com/results?email=$random_email_dkimvalidator"
echo -----

un peu d’admin sys

Outils pratique pour débutant (parce qu’il faut bien commencer quelquepart).

  • logwatch : envoi un rapport sur les événements des dernières 24h, avec le nombre de tentative de connexion ssh et diverses stats qui peuvent être utiles.
  • shorewall  : outil pour gérer iptables (à configurer)
  • mrtg          : graphiques et stats de traffic et d’utilisation (à configurer)
  • rkhunter   : recherche si le serveur est infecté ou si des fichiers « importants » ont été modifiés (penser à utiliser `rkhunter –propupd` après un `apt-get upgrade`
  • chkrootkit : détermine si la machine est infectée par un rootkit

  • cron-apt: vérifie tous les jour si le serveur doit être mis à jour. (a configurer)
  • clamav : détecte trojans, viruses, malware, …
  • spamassassin : détermine si un email est un spam (utile si on utilise la machine comme serveur de mail)

 

shorewall

pour gérer iptables avec des fichiers de configuration.
installation : apt-get ?
utilisation  : editer les fichiers /etc/shorewall  & service start
config : nécessaire, un peu complexe
http://biowikifarm.net/meta/Server_ports_and_shorewall_installation

mrtg

pour avoir des stats temps réel sur l’état de santé de la machine (cpu, hits apache, traffic réseau)
Installation: apt-get ?
Utilisation : (se cron
utiliser cfgmaker > mrtg.cfg / indexmaker mrtg.cfg > index.html
config : nécessaire
difficulté moyenne
http://blog.nicolargo.com/2010/02/mrtg-un-tutoriel-simple-et-rapide.html
http://www.onlamp.com/pub/a/bsd/2000/10/05/Big_Scary_Daemons.html

rkhunter

cherche les trucs louche sur la machine (malware, rootkit, faille potentielles)
installation: apt-get
utilisation: se lance en cron tout seul comme un grand
configuration : nécessaire si vous voulez recevoir un rapport par mail
/etc/rkhunter.conf ( MAIL-ON-WARNING )
/etc/default/rkhunter ( REPORT_EMAIL pour recevoir tous les rapports)
plutot simple
la commande –propupd est à connaitre

chkrootkit

détermine si la machine est infectée par un rootkit
installation: apt-get
utilisation: exécuter en root
configuration: rien de particulier

spamassassin

pour filtrer les spams
installation:
utilisation:
configuration:

logwatch

recevoir un rapport journalier (ou plus, ou moins) sur ce qui s’est passé sur le serveur
installation:
utilisation:
configuration:

cron-apt

exécuter un apt-cron –update automatique et recevoir un message quand une mise à jour est à faire
installation:
utilisation:
configuration:

script to quickly create vhost + dir + chrooted sftp user

Attention ! This script is a draft. A lot of checks are not made.

Note: This require a little configuration in /etc/ssh/sshd_config

#!/bin/bash
# File : new-site
# Author: Michaël Marinetti
# Description: Create a new vhost named "foo.com", for the user "foo"
# and add him to the sftp user (which is chrooted).
# Default vhost does not allow php.
#
# Created : 2012-07-21
# Modified :
#
# CHANGELOG
#
# TODO
# * apache check vhost syntax
# * template file for vhost
# * config file for default values
# * add --help and --verbose
# *

DEFAULT_MAIL=default.mail.to.use@example.com
# ServerAdmin mail
ADMINMAIL=admin@example.com

sitename="$1"
usermail="$2"

apache_sites_dir=/etc/apache2/sites-available
base_dir=/home/web
if (test "$usermail" = "" ) then
usermail=$DEFAULT_MAIL

fi

if (test "$sitename" = "" ) then
echo "error, sitename empty. USAGE: new-site [sitename] [user email]"
exit 1
fi

# test if this name is valid and available
valid_name=`echo "$sitename"|grep '^[0-9a-z.-]*\.\(com\|net\|fr\|org\|info\)$'`

if ( test "$valid_name" != "$sitename") then
echo "invalid domain name: must match the regex #^[a-z.-]*\.(com|net|fr|org|info)$#"
exit 2
fi

user=$(echo $sitename|sed 's#\(.*\)\.[^.]*#\1#' )

if ( test -e "$base_dir/$user" ) then
echo "oO, directory already exists"
exit 3
fi

if ( test -e "$apache_sites_dir/$sitename" ) then
echo "oO, vhost already exists"
exit 4
else
echo "no vhost of that name present (this is normal) "
fi

# creating user for that directory only :)
# username is, by default, the domain name without ".fr/.com" at the end
user=$(echo $sitename|sed 's#\(.*\)\.[^.]*#\1#' )
# let's generate an easy to remember random password with apg
pass=`apg -q -a 0 -n 1 -M NCL`
pass_crypted=$(perl -e "print crypt($pass, 'password')");

# creating directory with correct rights :)
mkdir -p $base_dir/$user/www $base_dir/$user/prive

useradd -s /bin/false -M -d $base_dir/$user -g sftp -p $pass_crypted $user
if (test $? -eq 0 ) then
echo "user $user created."
else
echo "User $user NOT CREATED...... MAYBE ALREADY EXIST ?"
fi

chown root:sftp $base_dir/$user -R && chmod 755 $base_dir/$user/www -R

chmod g+w $base_dir/$user/www $base_dir/$usr/prive
#@TODO use a template file
echo "ici" > $base_dir/$user/www/index.html

chmod +x $base_dir/$user -R

tmpfile=`mktemp`

vhost_def="
ServerAdmin $ADMINMAIL
ServerName $sitename
ServerAlias www.$sitename

php_admin_value engine off

Options FollowSymLinks
AllowOverride None


DocumentRoot /home/web/$user/www

Options FollowSymLinks
AllowOverride None


Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all


# Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
LogLevel warn
ErrorLog \${APACHE_LOG_DIR}/error-$sitename.log
CustomLog \${APACHE_LOG_DIR}/access-$sitename.log combined

"
echo "$vhost_def" > $tmpfile

echo "$vhost_def"

echo "Validate (no will open edit) (y/n) ?"
read pouet
if (test "$pouet" != "y" -a "$pouet" != "Y") then
echo "Edition vhost ..."
# vim +":r! cat $tmpfile" $apache_sites_dir/$sitename
vim $tmpfile
fi

cp $tmpfile $apache_sites_dir/$sitename
# always cleaning after works is done
rm $tmpfile

echo "I'm really proud of that script which
- create vhost
- create sftp user and chroot him.
- m'envoie tout ça !

host $sitename
user $user
pass $pass
"|mail -s "sftp - new user password" $usermail
# how to handle password ?
# passwd
# how to send all this informations :p

# enabling vhost
a2ensite $sitename

# reload apache :)
service apache2 restart