Nella versione 4.1 di Alfresco è stato introdotto su Share un filtro CSRF per prevenire attacchi di tipo Cross-Site Request Forgery. Se viene utilizzato un web server Apache come front end HTTPS verso Share, potrebbe essere necessario effettuare delle modifiche sulle configurazioni di default del filtro CSRF su Share. In questo articolo ho riportato due possibili soluzioni. Di seguito una tipica configurazione per accedere a Share in VirtualHost su Apache con mod_proxy e direttiva SSLEngine.
Apache SSL VirtualHost
### Apache vhost config: /etc/httpd/conf.d/my_virtual_hosts.conf ### <VirtualHost *:443> ServerName myalfresco.com ProxyPass /share http://host:8080/share ProxyPassReverse /share http://host:8080/share SSLEngine on SSLProtocol all SSLCertificateFile /secure_path_to_ssl_certs/mycert.crt SSLCertificateKeyFile /secure_path_to_ssl_certs/mycert.crt.key SSLCertificateChainFile /secure_path_to_ssl_certs/mycert.crt.intermediate </VirtualHost>
ERRORE Login Share
INFO [site.servlet.CSRFFilter] [ajp-apr-8009-exec-4] Possible CSRF attack noted when asserting referer header 'https://myalfresco.com/share/page/'. Request: POST /share/page/dologin ERROR [alfresco.web.site] [ajp-apr-8009-exec-4] javax.servlet.ServletException: Possible CSRF attack noted when asserting referer header 'https://myalfresco.com/share/page/'. Request: POST /share/page/dologin
SOLUZIONE 1 – Impostare il FQDN su referer e origin
Step1. Copiare la definizione “CSRFPolicy” config di default dal file:
TOMCAT_HOME/webapps/share/WEB-INF/classes/alfresco/share-security-config.xml
nel file:
TOMCAT_HOME/shared/classes/alfresco/web-extension/share-config-custom.xml
Step 2. Aggiungere l’attributo replace=”true” sul config “CSRFPolicy”
<config evaluator="string-compare" condition="CSRFPolicy" replace="true">
Step 3. Impostare le proprietà referer e origin con il FQDN (https) usato per il VirtualHost
<config evaluator="string-compare" condition="CSRFPolicy" replace="true"> <properties> <token>Alfresco-CSRFToken</token> <!-- Use the pipe | in the regex as OR operator: URL1|URL2|... --> <referer>https://myalfresco.com/.*</referer> <origin>https://myalfresco.com</origin> </properties> <!-- blablabla --> </config>
SOLUZIONE 2 – Disabilitare il CSRF Token Filter
Decommentare il config “CSRFPolicy” in:
TOMCAT_HOME/shared/classes/alfresco/web-extension/share-config-custom.xml
<config evaluator="string-compare" condition="CSRFPolicy" replace="true"> <filter/> </config>
ERRORE Admin Console Alfresco (Node Browser)
Le chiamate via webscript API dalla console di amministrazione (/alfresco/s/admin) possono generare l’errore CSRF quando per esempio, si tenta di utilizzare la finzionalità browser dei nodi.
SOLUZIONE 1 – Disabilitare il filtro CSRF su chiamate del tipo /alfresco/s/admin/admin-nodebrowser
Step 1. Creare (se non presente) il file: <ALFRESCO_HOME>/tomcat/shared/classes/alfresco/extension/web-scripts-config-custom.xml
Step 2. Disabilitare la dichiarazione del filtro CSRF
<!-- Disable CSRF filter. Config below overrides those include here: alfresco/WEB-INF/classes/alfresco/web-client-security-config.xml CSRF Filter disabled on URLs /alfresco/s/* --> <alfresco-config> <config evaluator="string-compare" condition="CSRFPolicy" replace="true"> <filter/> </config> </alfresco-config>
Ciao Giuseppe,
innanzittutto complimenti per gli ottimi consigli/configurazioni su questo sito.
Volevo chiederti un consiglio.
Sto implementando una nuova istanza di alfresco 5.0.d su cloud (amazon).
considerazioni:
1) vorrei mettere un reverse proxy direttamente esposto su internet e la macchina alfresco non esposta per sicurezza, per questo basta apache reverse_proxy (yum install mod_ssl) , corretto?
2) avrei bisogno di abilitare https su alfresco share, di default é abilitata, basta modificare alfresco global properties, però il mio dubbio riguarda il certificato da acquistare (per rimuovere quel fastidioso messaggio del browser che dice che il sito non é attendibile – comprando un ssl certificate ed installandolo su alfresco il problema si risolverebbe, ma non so come fare a fare ciò (installazione intendo); come installare su alfresco un certificato pubblico acquistato regolermente???
3) Posso fare il modo che all’avvio di alfresco sia caricata solamente l’istanza Share e non quella di Alfresco? (noi useremmo solo share)
Grazie mille
Ciao Roberto,
cerco di darti qualche info utile.
1) Per una configurazione minimale (solo HTTP) di Apache in modalità proxy/reverse non hai bisogno di mod_ssl che ti serve solo nel caso volessi abilitare connessioni sicure via TLS. Nel tuo caso potresti bloccare con iptables l’accesso pubblico HTTP sulla porta 8080 di Alfresco e aprire il traffico solo sulla 80. In questo modo ti basta configurare un proxy/reverse HTTP o AJP su Apache e gestire il tuo portale con un unico front-end web che inoltra le richieste direttamente verso Share. Ho scritto qualcosa in passato dai un’occhiata qui:
http://www.giuseppeurso.eu/configurare-piu-siti-sullo-stesso-web-server-apache-direttiva-virtualhost/
2) Per il discorso fatto in precedenza, se Apache e Alfresco sono in esecuzione sulla stessa macchina, non hai bisogno di TLS su Alfresco (che comunque è abilitato di default sulla porta 8443). Puoi sempre usare Apache come unico front-end in modalità proxy/reverse HTTP o AJP. Se invece hai bisogno anche di un front-end HTTPS, sarà sufficiente configurare solo Apache con il tuo certificato SSL trusted acquistato da un provider di servizi come GeoTrust o RapidSSLOnline. Dai un’occhiata a questa guida con RapidSSLOnline:
http://www.giuseppeurso.eu/come-rinnovare-un-certificato-ssl-wildcard-con-rapidsslonline/
3) Assolutamente NO, poichè il vero cuore pulsante di Alfresco è proprio Alfresco.
Share è solo una webapp che serve a presentare il Content Repository e tutte le sue funzionalità di gestione documentale. Dai un’occhiata al wiki per un approfondimento sulla sua architettura:
https://wiki.alfresco.com/wiki/Alfresco_Repository_Architecture
Giuseppe