Clark's Home page

Tecnicismi vari di un Sysadmin Linux ma anche qualcosa della sua vita

Apache2 per SugarCrm —

Il web server a cui si appoggia SugarCrm è Apache2,  di seguito le note di configurazione e hardening.
apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 libapache2-mod-php5 php5-common php5-gd php5-idn php-pear php5-imap php5-mcrypt php5-mhash php5-mysql php5-sqlite php5-xmlrpc php5-xsl php5-curl libapache-mod-security,
che si tirano dietro tutte le necessarie dipendenze,  poiché questo sito lavorerà solo in https genero le chiavi necessarie come spiegato qui.
abilito il modulo ssl con a2enmod ssl.
Riprendo dopo qualche giorno questa configurazione per renderla un pochino piu’ flessibile visto che mi son trovato davvero male a fare degli aggiornamenti.

Sotto /etc/apache2 creo la directory myconf e li sotto metteo tutte le personalizzazioni possibili, in modo che siano facilmente escludibili aggiungendo al file apache2.con la direttiva  “Include” myconf/ che all’occorenza può essere commentata.

In /etc/apache2/myconf creo il file mod_security che contiene:
<IfModule mod_security.c>
# mod_security configuration directives
# …
# Turn the filtering engine On or Off
SecFilterEngine On
# The audit engine works independently and
# can be turned On of Off on the per-server or
# on the per-directory basis
SecAuditEngine RelevantOnly
# Some sane defaults
#Check if URL characters where encoded
SecFilterCheckURLEncoding On
#Check UTF-8 encoding
SecFilterCheckUnicodeEncoding Off
#Allow 1 byte characters
# Accept almost all byte values
SecFilterForceByteRange 0 255
# Should mod_security inspect POST payloads
SecFilterScanPOST On
# Server masking is optional
# SecServerSignature “Microsoft-IIS/0.0”
SecAuditEngine RelevantOnly
# The name of the audit log file
SecAuditLog /var/log/apache2/audit_log
# Require HTTP_USER_AGENT and HTTP_HOST headers
SecFilterSelective “HTTP_USER_AGENT|HTTP_HOST” “^$”
# You normally won’t need debug logging
# Debug level set to a minimum
SecFilterDebugLog /var/log/apache2/modsec_debug_log
SecFilterDebugLevel 0
# Should mod_security inspect POST payloads
SecFilterScanPOST On
# By default log and deny suspicious requests
# with HTTP status 500
SecFilterDefaultAction “deny,log,status:500”
# Only accept request encodings we know how to handle
# we exclude GET requests from this because some (automated)
# clients supply “text/html” as Content-Type
SecFilterSelective REQUEST_METHOD “!^GET$” chain
SecFilterSelective HTTP_Content-Type “!(^$|^application/x-www-form-urlencoded$|^multipart/form-data)”
# Require Content-Length to be provided with
# every POST request
SecFilterSelective REQUEST_METHOD “^POST$” chain
SecFilterSelective HTTP_Content-Length “^$”
# Don’t accept transfer encodings we know we don’t handle
# (and you don’t need it anyway)SecFilterSelective HTTP_Transfer-Encoding “!^$”
# Some common application-related rules from
# http://modsecrules.monkeydev.org/rules.php?safety=safe
#Nuke Bookmarks XSS
SecFilterSelective THE_REQUEST “/modules\.php\?name=Bookmarks\&file=(del_cat\&catname|del_mark\&markname|edit_cat\&catname|edit_cat\&catcomment|marks\&catname|uploadbookmarks\&category)=(<[[:space:]]*script|(http|https|ftp)\:/)”
#Nuke Bookmarks Marks.php SQL Injection Vulnerability
SecFilterSelective THE_REQUEST “modules\.php\?name=Bookmarks\&file=marks\&catname=.*\&category=.*/\*\*/(union|select|delete|insert)”
#PHPNuke general XSS attempt
#/modules.php?name=News&file=article&sid=1&optionbox=
SecFilterSelective THE_REQUEST “/modules\.php\?*name=<[[:space:]]*script”
# PHPNuke SQL injection attempt
SecFilterSelective THE_REQUEST “/modules\.php\?*name=Search*instory=”
#phpnuke sql insertion
SecFilterSelective THE_REQUEST “/modules\.php*name=Forums.*file=viewtopic*/forum=.*\’/”
# WEB-PHP phpbb quick-reply.php arbitrary command attempt
SecFilterSelective THE_REQUEST “/quick-reply\.php” chain
SecFilter “phpbb_root_path=”
#Topic Calendar Mod for phpBB Cross-Site Scripting Attack
SecFilterSelective THE_REQUEST “/calendar_scheduler\.php\?start=(<[[:space:]]*script|(http|https|ftp)\:/)”
# phpMyAdmin: Safe
#phpMyAdmin Export.PHP File Disclosure Vulnerability
SecFilterSelective SCRIPT_FILENAME “export\.php$” chain
SecFilterSelective ARG_what “\.\.”
#phpMyAdmin path vln
SecFilterSelective REQUEST_URI “/css/phpmyadmin\.css\.php\?GLOBALS\[cfg\]\[ThemePath\]=/etc”

#SQL injection
SecFilter “delete[[:space:]]+from”
SecFilter “insert[[:space:]]+into”
SecFilter “select.+from”
SecFilter “drop[[:space:]]table”
SecFilter “<script”
SecFilter “<.+>”
</IfModule>

creo  il file /etc/apache2/myconf/myapache2.conf  che contiene:

<IfModule mod_security.c>
# Turn the filtering engine On or Off
SecFilterEngine On

# Make sure that URL encoding is valid
SecFilterCheckURLEncoding On

# Unicode encoding check
SecFilterCheckUnicodeEncoding Off

# Only allow bytes from this range
SecFilterForceByteRange 0 255

# Only log suspicious requests
SecAuditEngine RelevantOnly

# The name of the audit log file
SecAuditLog /var/log/apache2/audit_log
# Debug level set to a minimum
SecFilterDebugLog /var/log/apache2/modsec_debug_log
SecFilterDebugLevel 0

# Should mod_security inspect POST payloads
SecFilterScanPOST On

# By default log and deny suspicious requests
# with HTTP status 500
SecFilterDefaultAction “deny,log,status:500”

</IfModule>
Ora posso modificare il file /etc/apache2/conf.d/security modificando le due voci
[orig] ServerTokens OS
[mod] ServerTokens Prod
e
[orig] ServerSignature On
[mod] ServerSignature Off
che rispettivamente indicano negli header che il server trasmette al client che sistema operativo hosta il sito e la versione di apache2, informazioni utili a un possibile attacker per sfruttare vulnerabilità note o meno note di quegli elementi specifici.

Creo in /etc/apache2/sites-avaible il virtual-host crm.myfirm.com che contiene:
<VirtualHost *:443>
ServerAdmin webmaster@myfirml.com
ServerName crm.myfirm.com
DocumentRoot /var/www/crm.myfirm.com/
php_admin_value open_basedir /var/www/crm.myfirm.com
Options +FollowSymLinks
SSLEngine on
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
SSLCertificateFile /etc/ssl/myfirm/crm.myfirm.com.crt
SSLCertificateKeyFile /etc/ssl/myfirm/crm.myfirm.com.key
SSLCACertificateFile /etc/ssl/myfirm/myfirm-CA.crt
</VirtualHost>

Con a2ensite  lo rendo disponibile e il sito e’ pronto.

Per pura paranoia (qualcuno disse: “non è in dubbio se tu sia paranoico o meno, piuttosto quanto tu lo sia), mi sono posto il quesito e  se per puro sbaglio qualcuno ci capita sopra?
Cioè se Mr Murphy. quel giorno è particolarmente in vena e il gatto della Signora Giusy (che non idea di chi sia) camminando sulla tastiera digita https://crm.myfirm.com?
la Signora in questione potrebbe accorgersi che c’è  un sito che richiede nome e password…
Ciò è MALE!
Necessita un filtro di prima istanza per poterti loggare al crm devi sapere che c’è e non solo devi anche dire chi sei prima di poterti loggare e operare.
La soluzione la troviamo in htpasswd, possiamo ipotizzare una unica login e password per avere accesso alla login vera e propria che poi sarà a seconda dei casi con permessi di varia natura ma questo a livello di applicativo, Io voglio che per arrivare all’applicativo il sistema riconosca che si e’ autorizzati e quindi htpasswd -cbs /etc/apache2/.htpasswd  agent passwordcomune
Cosi’ facendo creiamo sotto /etc/apache2 il file .htpasswd che conterrà la login agent e la password passwordcomune criptata in SHA

Configurazione finita e hardenizzata per quanto possibile.

files di configurazione:
apache2.conf.tar
myapache2.conf.tar
mod_security.tar
security.tar
crm.myfirm.com.tar

Per comodità allego qui i files di configurazione di apache2

 

 


Categorised as: Linux | Sistemi operativi | Work

Comments are disabled on this post


Comments are closed.