gnome e collegamenti ftp

in molte installazioni di Ubuntu 11.04 la gestione dei segnalibri remoti di gnome utilizza firefox per aprire i collegamenti ftp invece di nautilus, che permette di interagire con i files remoti come se fossero sul nostro pc.

per ripristinare questa comodità:

in .gconf/desktop/gnome/url-handlers/ftp/%gconf.xml
(se la directory ftp o il file non esistono: crearli)
e sostituire il contenuto con:
<?xml version="1.0"?>
<gconf>
<entry name="needs_terminal" mtime="1314179741" type="bool" value="false"/>
<entry name="enabled" mtime="1314179741" type="bool" value="true"/>
<entry name="command" mtime="1314179741" type="string">
<stringvalue>/usr/bin/nautilus</stringvalue>
</entry>
</gconf>

perché la modifica abbia effetto è necessario terminare la sessione di gnome ed entrare nuovamente con l’utente interessato.

Posted in linux | Tagged , , , | Leave a comment

far usare a freeradius un server mysql esterno

in modo da permettere ad un server freeradius con accesso non temporizzato di condividere gli utenti con un altro che invece l’accesso temporizzato ce l’ha.

configurazione server mysql
in /etc/mysql/my.cnf impostare:

bind-address = 0.0.0.0

per fare in modo che il server mysql accetti connessioni su tutte le interfacce (di default è solo da 127.0.0.1)
riavviamo poi il server mysql (su ubuntu):

$ service mysql restart

inoltre è necessario abilitare la connessione dell’utente specifico, comunicandolo al server mysql stesso:

$ mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'[ip-del-server-radius]' IDENTIFIED BY '[radiuspassword]';
mysql> FLUSH PRIVILEGES;

ricordarsi su iptables di aprire le connessioni dall’ip del server radius
iptables -I INPUT -p tcp --destination-port mysql -s [ip-del-server-radius] -j ACCEPT

configurazione server freeradius
in /etc/freeradius/sql.conf impostare correttamente:

server = "[ip-del-server-mysql]"
#port = 3306
login = "radius"
password = "[radiuspassword]"

poi è necessario modificare le query di verifica che usa il server freeradius, questo perché se nel database mysql sono presenti anche le informazioni per la temporizzazione degli account il solo username non è più sufficente per identificare univocamente il record dell’utente: è necessario cercare il record definito da username e da Attribute=’Password’.
pertanto, in /etc/freeradius/sql/mysql/dialup.conf modifichiamo:

authorize_check_query = "SELECT id, username, attribute, value, op \
FROM ${authcheck_table} \
WHERE username = '%{SQL-User-Name}' \
AND Attribute = 'Password' \
ORDER BY id"
authorize_reply_query = "SELECT id, username, attribute, value, op \
FROM ${authreply_table} \
WHERE username = '%{SQL-User-Name}' \
AND Attribute = 'Password' \
ORDER BY id"

e riavviamo il server radius (su ubuntu):

$ service freeradius restart

ricordarsi su iptables di aprire le connessioni verso l’ip del server mysql
iptables -I OUTPUT -p tcp --destination-port mysql -d [ip-server-mysql] -j OPEN
# e se non c'è già
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Posted in linux | Tagged , , | Leave a comment

accesso autenticato ad internet tramite hotspot

Questo post è sostanzialmente un aggiornamento di quest’altro (che era una rielaborazione di un altro ancora ;-) ), ma ormai il tempo e l’esperienza consigliano di riscriverlo da zero, invece di aggiornarlo…

Lo scopo di questo howto è ottenere un server che faccia da “ponte” tra una rete interna ed internet, concedendo la connessione però solamente agli utenti autorizzati (da una coppia nome utente / password).

La base per l’installazione, stavolta, è una ubuntu server 10.04 (la distribuzione LTS disponibile in questo moemnto).
Nota importante: è necessario utilizzare la distribuzione a 32 bit, anche su macchine che potrebbero utilizzare quella a 64 bit.
Il perché è legato ad un bug nella gestione della cifratura delle password che non diventa evidente se non avanti nel processo di configurazione.

installazione e configurazione del sistema
Come prima cosa procediamo quindi ad installare il sistema, ed alla richiesta di quali servizi aggiuntivi installare scegliamo openssh-server, così da poter proseguire da remoto con l’installazione/configurazione.

modifichiamo poi /etc/ssh/sshd_config in modo che si legga:

PermitRootLogin no

e riavviamo il server ssh:

$ service ssh restart

in /etc/network/interfaces la struttura dovrà assomigliare a questa:

auto lo
iface lo inet loopback

# eth0: interfaccia verso la rete esterna
# dhcp o statica a seconda delle impostazioni del provider
auto eth0
iface eth0 inet dhcp

# eth1: interfaccia verso la rete interna
auto eth1
iface eth1 inet static
address 0.0.0.0

 

perché il sistema possa poi far transitare i pacchetti provenienti dagli altri computer è necessario abilitare l’ip forwarding, inserendo in /etc/rc.local la linea:

$ echo "1" > /proc/sys/net/ipv4/ip_forward

ed eseguendola anche nel terminale, per abilitare l’ip forwarding durante il ciclo di vita del sistema corrente.

dopodiché è consigliabile riavviare i servizi di rete (attenzione se siete connessi via ssh) con:

$ service networking restart

Ora dobbiamo installare il modulo tun, che servirà per la pseudointerfaccia interna:

$ apt-get install uml-utilities
$ modprobe tun
$ echo "tun" >> /etc/modules

installazione di chillispot
chillispot è disponibile nei repository di ubuntu, quindi per installarlo:

$ apt-get install chillispot

rispondendo poi alle domande del configuratore:

  • server radius 1: 127.0.0.1
  • radius password: [radiuspassword]
  • interfaccia di rete: quella per la rete interna, nel nostro caso eth1
  • url per autenticazione: https://[ip-esterno-del-server]/cgi-bin/hotspotlogin.cgi
  • url homepage: https://127.0.0.1 (ma questa andrà poi commentata nel file di configurazione)
  • UAM password: [password-condivisa-tra-chilli-e-webserver]

a questo punto chillispot è installato, ma disattivato (lo attiveremo più avanti).

installazione di freeradius e del server mysql
installiamo ciò che ci serve dai repository, insieme alle loro dipendenze:

$ apt-get install mysql-server freeradius freeradius-mysql freeradius-dialupadmin

creiamo la password per l’utente mysql quando ci viene richiesta, e poi creiamo un nuovo database chiamandolo “radius”:

$ mysql -u root -p

[inseriamo la password di mysql root]

mysql> CREATE DATABASE radius;
mysql> quit

creiamo poi l’utente del db “radius” e costruiamo il database usando le tabelle foniteci da freeradius:

$ cat /etc/freeradius/sql/mysql/schema.sql | mysql -u root -p radius
$ mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'radiusdbpassword';
mysql> FLUSH PRIVILEGES;
mysql> quit

quindi in /etc/freeradius/sql.conf modifichiamo la sezione “Connect info” inserendo i dati di accesso alla base di dati appena impostati

testiamo ora il funzionamento di freeradius: prima usando un file locale per leggere gli utenti, e poi finalmente dal database mysql.
in /etc/freeradius/radiusd.conf impostiamo:

listen {
...
ipaddr = 127.0.0.1
...
}
...
proxy_requests = no
...

poi in /etc/freeradius/users, verso l’inizio del file, inseriamo la riga

test Auth-Type := Local, Cleartext := "testsecret"

e nel file /etc/freeradius/clients.conf impostare correttamente i valori seguenti:

client localhost {
...
ipaddr = [ip-esterno-del-server]
...
secret = [radiuspassword]
...
}

aggiungendo anche un:

client localalias {
ipaddr = 127.0.0.1
secret = [radiuspassword]
shortname = localalias
nastype = other
}

e poi proviamo ad avviare i server freeradius con:

$ service freeradius start

ed a testarlo con:

$ radtest test testsecret 127.0.0.1 0 [radiuspassword]

perché tutto stia funzionando l’output dovrebbe terminare con una riga simile a:

rad_recv: Access-Accept packet from host ...

se dovessero esserci problemi si può avviare il server in modalità debug (meglio in un’altra console, per poi seguirlo in tempo reale) con

$ freeradius -X

se tutto funziona è il momento di spostare l’autenticazione sul db mysql.
nel file /etc/freeradius/radiusd.conf, nella sezione Modules togliere il commento a:

$INCLUDE sql.conf

nel file /etc/freeradius/sites-enabled/default ci assicuriamo di togliere i commenti dalle righe con “sql” e di metterle a quelle con “files”:

authorize {
...
#files
sql
...
}

acct_unique {

#files

}

accounting {

sql

}

session {

sql

}

non cambiare invece i valori nella sezione “post-auth”.

riavviamo freeradius con:

$ service freeradius restart

ed inseriamo un utente di prova nel database:

$ echo "INSERT INTO radcheck (Username, Attribute, Value) VALUES ('mysqltest','Password','testsecret');" | mysql -u root -p

testando alla fine il tutto:

$ radtest mysqltest testsecret 127.0.0.1 0 radiuspassword

come prima, l’ultima riga della risposta dovrebbe assomigliare a:

rad_recv: Access-Accept packet from host ...

installare apache

$ apt-get install apache2 libapache2-mod-php5 libdate-manip-perl php5-mysql

poi in /etc/php5/apache2/php.ini aggiungere, nella sezione “Extensions”:

extension=mysql.so

fatto questo provvediamo ad installare gli script che gestiranno l’autenticazione via web degli utenti:

$ mkdir -p /var/www/hotspot{,/cgi-bin}
$ zcat -c /usr/share/doc/chillispot/hotspotlogin.cgi.gz > /var/www/hotspot/cgi-bin/hotspotlogin.cgi
$ chmod a+x /var/www/hotspot/cgi-bin/hotspotlogin.cgi

per poi modificare in /var/www/hotspot/hotspotlogin.cgi:

$uampassword=[password-condivisa-tra-chilli-e-webserver]
$userpassword=1

va poi creato il file /etc/apache2/sites-available/hotspot eventualmente usando questo come esempio (attenzione agli ip!):

hotspot (togliere il .txt)

a questo punto possiamo abilitare il nuovo sito ed il modulo ssl con:

$ a2ensite hotspot
$ a2enmod ssl

per usare correttamente ssl vanno generati i certificati appropriati, per comodità si può utilizzare apache2-ssl-certificate, creandolo come /usr/sbin/apache2-ssl-certificate (togliere il .txt) dandogli poi i permessi 766 (di root:root)

prima di lanciarlo creiamo la directory /etch/apache2/ssl:

$ mkdir /etc/apache2/ssl

controllando poi che i permessi siano drwxr-xr-x

e creiamo anche /usr/share/apache2/ssleay.cnf di root:root, con permessi 644, mettendoci dentro ssleay.cnf (togliere il _.txt)

finalmente lanciamo:

$ apache2-ssl-certificate

e compiliamo i campi coerentemente (quando viene chiesto “YOUR name” inserite l’ip esterno del server o un nome che un dns possa risolvere correttamente)

riavviamo apache:

$ service apache2 restart

ora andando a visitare https://ip-esterno/cgi-bin/hotspotlogin.cgi dovrebbe comparire una pagina generata da chillispot, che si lamenta che il demone non è in funzione…

ultima parte: configurazione di chillispot
modifichiamo /etc/chilli.conf:

net [fate attenzione che la rete generata non si sovrapponga con qualcosa che già esiste]
radiuslocation [impostarlo correttamente]
radiuslcoationname [impostarlo correttamente]
dhcpif [verificare che punti all'interfaccia giusta (in quest'esempio: eth1) ]
uamserver [dovrebbe essere https://ip-esterno/cgi-bin/hotspotlogin.cgi]
uamlisten [coerente con la rete che vorrete utilizzare]
#uamhomepage [commentato]
uamallowed [che contenga almeno questo pc, per sicurezza]

infine su /etc/default/chillispot impostare:

ENABLED=1

e finalmente…

$ service chillispot start

configurazione di iptables
perché tutto funzioni correttamente è necessario (oltreché consigliabile in ogni caso ;-) ) sistemare anche le impostazioni di iptables aggiungendo:

$ iptables -t nat -I POSTROUTING -j MASQUERADE

alle regole che avete per il vostro firewall.
diciamo almeno queste ;-) :

# per riduzione problemi dovuti a brute force ssh

$ iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource
$ iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH --rsource -j DROP
$ iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ iptables -A INPUT -i eth1 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
$ iptables -A INPUT -i eth1 -j REJECT --reject-with icmp-port-unreachable

# i pacchetti che provengono dall'interfaccia interna ma non sono stati accettati prima vengono droppati

$ iptables -A INPUT -i eth0 -j DROP

# qui arriva solo roba che non viene da eth1 o eth0, principalmente (e sperabilmente solo) tun0 e lo

$ iptables -A INPUT -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
$ iptables -A INPUT -p tcp -m tcp --dport 3990 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
$ iptables -A INPUT -i lo -j ACCEPT

# per log normativa antiterrorismo italiana :-(

$ iptables -A FORWARD -s [ip-rete-interna.0]/24 -i tun0 -o eth1 -m state --state NEW -j LOG --log-prefix "HOTSPOT:"

# i pacchetti che arrivano direttamente dal'interfaccia interna ma non passano per tun0 vengono droppati

$ iptables -A FORWARD -i eth0 -j DROP
$ iptables -A FORWARD -o eth0 -j DROP

e poi, come ultima aggiunta (che teniamo separata dato che potrebbe tagliarci fuori):

# ultima cosa: prima di questa accertarsi, se si sta usando ssh, di aver lasciato aperto la strada per questo pc

$ iptables -P INPUT DROP

Posted in linux, security | Tagged , , , , , , | Leave a comment

Convertire un modello 3d da Blender a OpenGL

Da un po’abbiamo cominciato a maneggiare le librerie grafiche OpenGL, soprattutto nella loro versione per device mobili.
Più di qualche volta però ci sarebbe stato comodo trasferire dei modelli semplici dal software di modellazione 3d (noi usiamo Blender) direttamente al codice del programma.
E così, dato che uno strumentino del genere in giro non s’è trovato… voilà, eccolo creato!
E già che ci siamo, perché non condividerlo?
Eccolo quindi, senza pretese grafiche o cotillons.
Siccome però usarlo online lo limita a causa delle risorse del server (un modello 3d può essere descritto da veramente TANTI punti, facce, etc, …) potete scaricarne anche il codice sorgente (in PHP) per farlo girare in locale o dove preferite (e, se volete, migliorarlo).
Lo script genera array appositi per: vertici, facce (trasformando quelle quadrate in due triangolari) e relativi vettori normali.

Per esportare da Blender nel formato da dare in pasto allo script si può agire così:

  1. scegliere il formato di esportazione Wavefront .objesportare il progetto in formato Wavefront (.obj)
  2. selezionare "Normals" nell'elenco degli attributi esportatiselezionare Normals nell’elenco degli attributi da esportare (di default è deselezionato) se si ha intenzione di utilizzare l’illuminazione di OpenGL
  3. solitamente verranno creati due files: uno .obj ed uno .mtl, quello da usare con lo script è ovviamente quello con estensione .obj
Posted in Uncategorized | Tagged , , , , | Leave a comment

vsftpd attraverso due NAT

installare un server ftp all’interno di una rete dove il gateway applica il NAT (cioé in pratica maschera gli indirizzi interni presentandosi alla rete esterna solamente con il suo, e gestendo il flusso di dati attraverso di se) assegnandogli un indirizzo privato può presentare qualche problema nei trasferimenti con i client, se anche questi stanno in una rete NATtata.
ad un certo punto infatti questi hanno bisogno di abbandonare la modalità attiva passando alla modalità passiva, ma qui casca il palco e la connessione viene persa. (il problema è ben esposto in questa pagina)
la scelta di installare il server ftp in quella posizione può comunque essere guidata da altre opportunità, di sicurezza e di accessibilità da parte della rete interna, quindi vale la pena cercare di risolvere la questione alla radice.

come server ftp utilizzeremo vsftpd su Debian Linux, e reindirizzeremo alcune porte dal gateway al server interno in modo da permettere l’accesso diretto esclusivamente al server anche dalla rete esterna.

Sul server ftp, ottenuti i privilegi di root, andremo quindi ad installare vsftpd:
apt-get install vsftpd
per poi modificarne il file di configurazione con:
nano /etc/vsftpd.conf
inserendovi in coda:
pasv_address=[ip esterno del gateway]
pasv_min_port=[porta non privilegiata più bassa (es. 5000)]
pasv_max_port=[porta non privilegiata più alta (es. 5100)]

che informano il server sulle informazioni da passare al client nel momento in cui questo richiedesse una connessione passiva.
Se non esplicitassimo queste informazioni il server darebbe il suo indirizzo ip (appartenente alla nostra rete interna) ed a quel punto il client non riuscirebbe più a comunicare con lui perché, al momento della prima connessione, l’interlocutore dal punto di vista del client è il gateway.
A questo punto verifichiamo che il nostro firewall locale sul server ftp accetti i pacchetti in entrata sulle porte dalla [porta non privilegiata più bassa (es. 5000)] alla [porta non privilegiata più alta (es. 5100)]:
iptables -I INPUT -p tcp --destination-port 5000:5100 -j ACCEPT
(per impostare le porte di esempio)

Dobbiamo ora impostare il gateway affinché gestisca questa situazione: reindirizzando una porta “ftp pubblico” a quella ftp del server (che può essere anche la 21, se non è già in uso sul gateway per altri servizi, o qualunque altra a patto che si avvertano gli utenti della porta anomala), ed anche le porte “alte” per la connessione passiva.
Connessi al gateway con i privilegi di root modifichiamo il firewall:
iptables -t nat -I PREROUTING -p tcp -m tcp --dport [porta pubblica ftp] -j DNAT --to-destination [ip del server ftp]:21
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 5000:5100 -j DNAT --to-destination [ip del server ftp]

è necessario anche avvertire il gateway di rimascherare i pacchetti ftp in uscita impostando se stesso come mittente:
iptables -t nat -I POSTROUTING -s [ip del server ftp]/32 -j SNAT --to-source [ip pubblico del gateway]
inoltre, autorizzare questi pacchetti al passaggio “attraverso” il gateway:
iptables -I FORWARD -d [ip del server ftp]/32 -j ACCEPT
iptables -I FORWARD -s [ip del server ftp]/32 -j ACCEPT

et voilà, fatto.
E’importante ricordarsi che se si è impostato sul gateway il servizio su una porta non standard ([porta pubblica ftp] non è 21) gli utenti ftp vanno avvisati del cambiamento in modo che possano impostare i client correttamente.

Posted in linux, security | Tagged , , | Leave a comment

nfs con ubuntu 10.10

misteriosamente, le installazioni di ubuntu 10.10 ci han dato un sacco di problemi a gestire i lock via NFS in una configurazione di rete che non aveva presentato problemi prima.
l’errore di dmesg era
statd: server x.y.z.k not responding, timed out
lockd: cannot monitor x.y.z.k

la soluzione è esplicitare la corrispondenza hostname-ip in /etc/hosts agiungendo:
x.y.z.k nomeserver

et voilà

Posted in linux | Tagged , , | Leave a comment

Rallentare un clip video

Per ottenere uno slow motion decente, cosa che con i vari software di montaggio per linux (tipo cinelerra) non si riesce ad avere :-( , si può usare un comando simile:

ffmpeg -i nome-file-input -f yuv4mpegpipe -pix_fmt yuv411p -y /dev/stdout \
     | yuvcorrect -T INTERLACED_BOTTOM_FIRST 2> /dev/null \
     | yuvdeinterlace -d \
     | yuvfps -s 30000:1001 -r 30000:1001 \
     | yuvcorrect -T PROGRESSIVE 2>/dev/null \
     | ffmpeg -f yuv4mpegpipe -i /dev/stdin -vcodec dvvideo \
     -acodec pcm_s16le -y nome-file-output

volendo è possibile farne un piccolo script bash, per semplificarsi la vita:

#!/bin/bash
#
# USAGE: slowdown.sh
#
# this script generates slowmotion interpolated dv video from the input file
# it needs ffmepg and mjpegtools to be installed on the system
#

if [ -z "$1" ]; then
      echo usage: $0 inputfile outputfile
      exit
fi
if [ -z "$2" ]; then
      echo usage: $0 inputfile outputfile
      exit
fi

ffmpeg -i $1 -f yuv4mpegpipe -pix_fmt yuv411p -y /dev/stdout \
      | yuvcorrect -T INTERLACED_BOTTOM_FIRST 2> /dev/null \
      | yuvdeinterlace -d | yuvfps -s 30000:1001 -r 30000:1001 \
      | yuvcorrect -T PROGRESSIVE 2>/dev/null \
      | ffmpeg -f yuv4mpegpipe -i /dev/stdin -vcodec dvvideo \
      -acodec pcm_s16le -y $2
Posted in linux | Tagged , , , | Leave a comment

video encoding per android

per encodare dei video in modo che siano visibili con l’applicazione “video” su un htc magic con android:

ffmpeg -i <input video>  -r 25 -b 864000 -s 480x320 -aspect 3:2 -vcodec libx264 <output>.mp4
Posted in linux | Tagged , , , | Leave a comment

ruotare i log di syslog con Debian

in Debian (e Ubuntu?) la rotazione dei files di log prodotti da syslog (auth.log, syslog, messages, … ) viene gestita autonomamaente e non tramite logrotate.

I files da utilizzare per cambiarne il comportamento sono:

/etc/cron.daily/sysklogd
/etc/cron.weekly/sysklogd
[e simili]

in questi files viene utilizzata una sintassi simile a:

for LOG in `syslogd-listfiles`
   do
      if [ -s $LOG ]; then
         savelog -g adm -m 640 -u root -c 1095 $LOG >/dev/null
      fi
done

dove con il comando

syslogd-listfiles

si ottiene la lista di files da gestire (è possibile filtralo con varie opzioni, ad esempio –auth)
e con il comando

savelog

si effettua la copia del log, nell’esempio specifico creando un file del gruppo adm, dell’utente root, e creandone 1095 copie prima di sovrascirvere il primo (nel caso specifico, essendo un esempio preso da cron.daily, tiene 3 anni di log)

Posted in linux, security | Comments Off

trasformare immagini in blocco via shell

per applicare ad un gruppo di immagini delle trasformazioni in serie è possibile usare convert, incluso in Imagemagick
il comando qui sotto, ad esempio, ridimensiona al 50% tutte i files con estensione jpg contenute nella cartella corrente ed in tutte le sottocartelle, ricorsivamente:

find . -name *.jpg -exec convert '{}' -resize 50% '{}' \;

per tutte le opzioni di convert basta digitare:
convert

Posted in linux | Tagged , , , | Leave a comment