Skip to content →

Tag: Google

Apache et Roundcube, sécurisation et obfuscation de version

AprĂšs installation d’un serveur de mail pour remplacer Google Apps sur mon domaine perso, j’ai trouvĂ© que Roundcube Ă©tait le seul webmail qui me plaisait Ă  peu prĂšs.

Quelques tips et tricks sur la sĂ©curisation de Apache / PHP et Roundcube, pas sur les serveurs Postfix / Dovecot, qui je l’espĂšre, viendront ici alimenter le blog avec du fail2ban …

  • Configuration du vHost et sĂ©curisation dossiers “sensibles”
<VirtualHost *:443>
        ServerAdmin postmaster@beufa.net
        ServerName  x.beufa.net
        DocumentRoot /var/www/x
        SSLEngine on
        SSLCipherSuite ALL:!ADH:RC4+SHA:+HIGH:+MEDIUM:+LOW:+EXP:+eNULL
        SSLProtocol all -SSLv2
        SSLStrictSNIVHostCheck on
        SSLOptions StrictRequire
        SSLCertificateFile     cert.pem
        SSLCertificateKeyFile  cert.pem
        #GnuTLSEnable on 
        #GnuTLSPriorities SECURE:!ANON-DH:!MD5
        #GnuTLSCertificateFile cert.pem
        #GnuTLSKeyFile cert.pem
        #GnuTLSCertificateChainFile cert.pem
        #GnuTLSCACertificatePath /

        <Directory /var/www/roundcube>
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        <Directory /var/www/roundcube/config>
                Options -FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /var/www/roundcube/temp>
                Options -FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /var/www/roundcube/logs>
                Options -FollowSymLinks
                AllowOverride None
                Order allow,deny
                Deny from all
        </Directory>

        <Directory /var/www/roundcube/plugins/enigma/home>
                Options -FollowSymLinks
                AllowOverride None
                Order allow,deny
                Deny from all
        </Directory>

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        ErrorLog ${APACHE_LOG_DIR}/05.x.beufa.net_error.log
        CustomLog ${APACHE_LOG_DIR}/05.x.beufa.net_access.log combined

</VirtualHost>
  • Supprimer les headers de mail PHP verbeux dans /etc/php5/apache2/php.ini
; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; http://php.net/expose-php
expose_php = Off
; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
; Example for Roundcube : X-PHP-Originating-Script: 33:main.inc in each mail sent 
mail.add_x_header = Off
  • Avoir des logs Apache / PHP dans un fichier spĂ©cifique
; The path to a log file that will log all mail() calls. Log entries include
; the full path of the script, line number, To address and headers.
;mail.log = /var/log/mail.apache-php.log

BientĂŽt d’autres tips sur le couple Postfix / Dovecot / Roundcube !

Comments closed

Auto héberger son Google Reader, part4

Ca y est, Google Reader est mort !!! J’ai bien fait d’anticiper cette sĂ©rie d’articles sur comment auto hĂ©berger son Google Reader.

Dernier petit tip sur la gestion du dĂ©marrage du script d’update :

Créer le fichier /etc/init.d/ttrss :

#!/bin/sh -e
# ligne de commande du programme
DAEMON="/var/www/rss/update_daemon2.php"
# argument à utiliser par le programme
DAEMON_OPT=""  #argument à utiliser par le programme
DAEMONUSER="www-data" #utilisateur du programme
DAEMON_NAME="ttrss" #Nom du programme (doit ÃÂȘtre identique à l'exécutable)

PATH="/sbin:/bin:/usr/sbin:/usr/bin" #Ne pas toucher

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

d_start () {
        log_daemon_msg "Starting system $DAEMON_NAME Daemon"
        start-stop-daemon --background --name $DAEMON_NAME -c www-data -Sbx $DAEMON -- $DAEMON_OPT
        log_end_msg $?
}

d_stop () {
        log_daemon_msg "Stopping system $DAEMON_NAME Daemon"
        start-stop-daemon --name $DAEMON_NAME --stop --retry 5 --quiet --name $DAEMON_NAME
        log_end_msg $?
}

case "$1" in

        start|stop)
                d_${1}
                ;;

        restart|reload|force-reload)
                        d_stop
                        d_start
                ;;

        force-stop)
               d_stop
                killall -q $DAEMON_NAME || true
                sleep 2
                killall -q -9 $DAEMON_NAME || true
                ;;

        status)
                status_of_proc "$DAEMON_NAME" "$DAEMON" "system-wide $DAEMON_NAME" && exit 0 || exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|force-stop|restart|reload|force-reload|status}"
                exit 1
                ;;
esac
exit 0

Ensuite, il faut suffit de taper les commandes suivantes :

[root@server:~]$ sudo chmod +x /etc/init.d/ttrss
[root@server:~]$ sudo chmod 0755 /etc/init.d/ttrss
[root@server:~]$ sudo update-rc.d ttrss defaults
update-rc.d: warning: /etc/init.d/ttrss missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
 Adding system startup for /etc/init.d/ttrss ...
   /etc/rc0.d/K20ttrss -> ../init.d/ttrss
   /etc/rc1.d/K20ttrss -> ../init.d/ttrss
   /etc/rc6.d/K20ttrss -> ../init.d/ttrss
   /etc/rc2.d/S20ttrss -> ../init.d/ttrss
   /etc/rc3.d/S20ttrss -> ../init.d/ttrss
   /etc/rc4.d/S20ttrss -> ../init.d/ttrss
   /etc/rc5.d/S20ttrss -> ../init.d/ttrss
[root@server:~]$ sudo chkconfig --list | grep ttrss
ttrss                     0:off  1:off  2:on   3:on   4:on   5:on   6:off

Si le service n’est pas activĂ©, il suffit de faire un :

[root@server:~]$ sudo chkconfig ttrss on

Amusez vous bien !

Next time : un article pour clean up la base des articles vieux de x mois, car aprĂšs plusieurs mois d’utilisation, la base peut vite atteindre les 70 / 100 MB…

Comments closed

Auto héberger son RSS Reader, part 3

Maintenant que notre lecteur de flux tourne, deux solutions pour dĂ©marrer le dĂ©mon d’update :

DĂ©marrage :

[user@home:~]$ sudo start-stop-daemon -c www-data -Sbx /var/www/[YOUR_PATH]/rss/update_daemon2.php

ArrĂȘt :

[user@home:~]$ killall php

Si vous avez un problĂšme de dĂ©marrage (messages sur le GUI du type “update daemon is not running”), tapez en connaissance de cause :

[user@home:~]$ sudo chmod 777 -R /var/www/[YOUR_PATH]/rss/{cache,feed-icons,lock,lib/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer}
[user@home:~]$ sudo chown www-data:www-data -R /var/www/[YOUR_PATH]/rss/{cache,feed-icons,lock,lib/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer}

Sinon vous pourrez toujours démarrer avec la crontab, mais vous aurez un message comme quoi le démon ne tourne pas ! Par exemple pour lancer un update toutes les 30 minutes :

[user@home:~]$ sudo crontab -l -u www-data
SHELL=/bin/bash
PATH=/bin:/usr/bin
MAILTO=user
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
*/30 *  *  *  * cd /var/www/[YOUR_PATH]/rss && /usr/bin/php update.php -feeds >/dev/null 2>&1

Bon amusement, maintenant vous avez un Google Reader @ Home.

AprĂšs quelques semaines d’utilisation, je suis Ă  20MB de DB MySQL occupĂ©e pour l’instant (sur 2To de Disque !!!) !

Comments closed

[Perl] VĂ©rifier vos sites automatiquement avec SafeBrowsing

SafeBrowsing est la base anti malware / anti phishing de Google. IntĂ©grĂ© Ă  Firefox et Google Chrome, il permet de valider que le site n’est pas un nid Ă  malware ou tentative de phishing.

Exemple SafeBrowsing

Pour tester par site :

http://www.google.com/safebrowsing/diagnostic?site=beufa.net

Ou par AS :

http://www.google.com/safebrowsing/diagnostic?site=AS:15069

Des modules existent en Perl pour automatiser ces vérifications :

use Net::Google::SafeBrowsing2;
use Net::Google::SafeBrowsing2::Storage;
use Net::Google::SafeBrowsing2::Sqlite;

Ensuite, quelques lignes de Perl suffit Ă  vĂ©rifier une liste de sites (qu’il est possible d’inclure depuis une base MySQL !)

my @sites =(
		'http://flashupdate.co.cc/',
		'https://beufa.net/',
		'http://www.fortinet.com/',
		'http://www.gumblar.cn'
		);

Créer une base locale, qui permettra de stocker les hashs localement

 my $storage_malware_db = Net::Google::SafeBrowsing2::Sqlite->new(file => 'goog-malware-shavar.db');
  my $malware_db = Net::Google::SafeBrowsing2->new(
        key     => "YOUR_KEY",
        storage => $storage_malware_db,
	error	=> 1,
##      debug   => 1,
##      mac     => 1,
        list    => MALWARE,
##	force	=> 1
  );

Il est possible de télécharger 2 bases (paramÚtre LIST) : MALWARE (goog-malware-shava.db) ou PHISHING (googpub-phish-shavar.db)

VĂ©rifier les mises Ă  jour :

  my $last_db1 = $storage_malware_db->last_update(list => 'goog-malware-shavar')->{time};
  my $next_db1 = $last_db1+$storage_malware_db->last_update(list => 'goog-malware-shavar')->{wait};
  my $last_db2 = $storage_phishing_db->last_update(list => 'googpub-phish-shavar')->{time};
  my $next_db2 = $last_db2+$storage_phishing_db->last_update(list => 'googpub-phish-shavar')->{wait};

  print color 'reset'; print color 'bold yellow';
  print "---   ----------------------------------   ----n";
  print "---   Updates of Google SafeBrowsing DBs   ----n";
  print "---   ----------------------------------   ----n";
  print color 'reset';  print color 'cyan';
  print "t > Last Up. (google-malware-shavar) : ".scalar(localtime($last_db1))."n";
  print "t > Next Up. (google-malware-shavar) : ".scalar(localtime($next_db1))."n";
  print "t > Last Up. (googpub-phish-shavar)  : ".scalar(localtime($last_db2))."n";
  print "t > Next Up. (googpub-phish-shavar)  : ".scalar(localtime($next_db2))."n";
  print color 'reset';

VĂ©rifiez ensuite que chacun des sites n’est pas dans les hashs Google SafeBrowsing :

print color 'reset'; print color 'bold yellow';
  print "--- -------------------------------------- ----n";
  print "--- Checking for Malwares Distribution URL ----n";
  print "--- -------------------------------------- ----n";
  foreach $site (@sites) {
	my $match_malware = $malware_db->lookup(url => $site);
	if ($match_malware eq MALWARE) {
		print color 'reset'; print color 'bold red';
        	print "t(MAL)tNOK => ".$site." => MALWARE n";
	}
	else {
		print color 'reset'; print color 'green';
        	print "ttOK  => ".$site."n";
	}
  }
  print color 'reset';
  print color 'reset'; print color 'red';
  print "--- Errors for Malwares Distribution Check ----n";
  print "Last malware_db error: ", $malware_db->last_error(), "n";
  print "--- -------------------------------------- ----n";
  $storage_malware_db->close();

Le résultat :

user@pc:~$ perl Bureau/safeb
---   ----------------------------------   ----
---   Updates of Google SafeBrowsing DBs   ----
---   ----------------------------------   ----
	 > Last Up. (google-malware-shavar) : Fri Nov 11 10:44:43 2011
	 > Next Up. (google-malware-shavar) : Fri Nov 11 11:14:49 2011
	 > Last Up. (googpub-phish-shavar)  : Fri Nov 11 10:44:57 2011
	 > Next Up. (googpub-phish-shavar)  : Fri Nov 11 11:16:36 2011
--- -------------------------------------- ----
--- Checking for Malwares Distribution URL ----
--- -------------------------------------- ----
	(MAL)	NOK => http://flashupdate.co.cc/ => MALWARE
		OK  => https://beufa.net
		OK  => http://fortinet.com
		OK  => http://gumblar.cn
--- Errors for Malwares Distribution Check ----
Last malware_db error:
--- -------------------------------------- ----
--- -------------------------------------- ----
--- Checking for Phishing Distribution URL ----
--- -------------------------------------- ----
		OK  => http://flashupdate.co.cc/
		OK  => https://beufa.net
		OK  => http://fortinet.com
		OK  => http://gumblar.cn
--- Errors for Phishing Distribution Check ----
Last phishing_db error:
--- -------------------------------------- ----

Bon amusement !

A venir : scan de pages avec ClamAV et son module File::Scan::ClamAV

Comments closed
en_USEN