Author: admin

vsftpd con utenti mysql e custom chrooted homedir

vsftpd con utenti mysql e custom chrooted homedir

I motivi per i quali possiamo voler scegliere vsftpd come server ftp, sono innumerevoli e non saranno oggetto di questo articolo.
Mi limito a dire che personalmente, l’ho scelto per la sua sicurezza, snellezza, prestazioni.
Del resto, si tratta di una soluzione scelta da redhat e consigliata da ibm.
Come al solito, tutto parte dalle mie esigenze per cui descriverò la mia soluzione e non tutte le possibilità che questo magnifico strumento offre.

La prima caratteristica desiderata è una gestione degli users tramite mysql e questo tramite pam è abbastanza semplice.
Leggermente più complicato è stato far si che più utenti potessero condividere la stessa homedir (immaginate 3 sviluppatori diversi che lavorano sullo stesso sito e di cui si vogliono tracciare gli accessi con differenti login)
Tutti gli accessi saranno chroot ossia gli utenti non potranno navigare l’intero filesystem.

La difficoltà principale è che non si può scrivere la homedir chroot in uno dei campi del db e sperare che vsftpd legga quel valore.
Questo limita di fatto, la possibilità di avere una gestione centralizzata degli accessi (in maniera nativa), per esempio tramite un front-end web, ecco come ho deciso di procedere e soprattutto di aggirare tale limitazione:

Settings

Sulla debian wheezy usata, avendo già installato e configurato mysql, è bastato un:

Le libpam-mysql sono fondamentali per permettere a vsftpd di leggere gli utenti presenti su mysql.

Aggiungere l’utente di sistema vsftpd:

Loggarsi come amministratore su mysql e creare database, utente e tabella.

Dentro /etc/pam.d/vsftpd commentare tutto e lasciare le seguenti righe che specificano a vsftpd come e dove cercare gli utenti su database

chiaramente è possibile cambiare i valori di crypt, debug e verbose a piacimento, tuttavia inizialmente è preferibile avere dei log prolissi.

L’ultimo file di configurazione è quello fondamentale per vsftpd ovvero /etc/vsftpd.conf
Per il significato di ognuna delle seguenti direttive vi rimando alla guida ufficiale.

Una delle direttive specificate in vsftpd.conf è la “user_config_dir”
che abbiamo settato a /etc/vsftpd/user_conf
Questa dice vsftpd dove cercare i settaggi specifici per ogni utente ed è il modo più semplice per avere una home diversa per ognuno di loro ma anche per poter avere più users con la stessa home.

Prima di tutto assicuriamoci di creare la directory che conterrà le configurazioni specifiche:

Il formato è molto semplice, basta creare un file con il nome utente presente nel db e mettere dentro poche righe di testo:

Non dimenticatevi di riavviare il servizio

Adesso tutto è funzionante ma è certamente scomodo dover inserire a mano gli utenti nel db e poi creare il relativo file di configurazione dentro /etc/vsftpd/user_conf
Per rendere tutto molto semplice ho creato un piccolo script perl che fa tutto il lavoro sporco per noi.
Lo script essenzialmente permette di aggiungere ed eliminare utenti in maniera velocissima, si preoccuperà lui di inserire o eliminare la voce del db e di conseguenza il file di configurazione necessario.
Lo script crea automaticamente la homeDir specificata e imposta i permessi corretti per poter lavorare in chroot.
Per un corretto chroot infatti è necessario che la directory specificata, non abbia i permessi di scrittura e che contenga all’interno una seconda directory con tali permessi, questa seconda directory sarà l’unico punto in cui l’utente potrà effettivamente scrivere.
Se non si rispettà questo schema, vsftpd non funzionerà correttamente e sui nostri client ftp leggeremo un laconico:

500 OOPS: vsftpd: refusing to run with writable root inside chroot ()

Entrambe le directory, devono poi appartenere a vsftpd e gruppo nogroup.
Lo script permette anche di vedere la lista di utenti presenti, modificare la password o la homeDir e di copiare automaticamente un file dentro la directory con i permessi di scrittura.
Quest’ultima caratteristica risulta utile nel caso si voglia lasciare all’utente un readme oppure nel caso si tratti di un sito web, creare una index di default.

Per aggiungere un utente basta digitare:

Tutte le modifiche saranno attive in tempo reale senza la necessità di riavviare il server.
L’unico “sforzo” richiesto è editare lo script per aggiungere i propri parametri di configurazione
del db, la directory dove vengono scritte le configurazioni degli utenti, uid e gid di vsftpd.
Insomma operazione da pochi minuti.

Lo script lo trovi su github:
https://github.com/bogomips/syncFtp.pl

Buon divertimento con vsftpd !

PS
Questa guida è stata utilizzata come base per un’altra guida su debianizzati.org dove è anche stata integrata una sezione relativa a TLS:
http://guide.debianizzati.org/index.php/Installare_un_server_vsFTPd_con_utenti_virtuali_su_MySQL

colword : A command line word highlighter

colword : A command line word highlighter


I often prefer just to hilight some words rather than grep them, it’s good not to loose the contexst.
colword is a very basic version of grep but it does not suppress any line, it just colors the matched word.

It’s super easy to use:

colworld’s source code

 

Bash scripting: Apply a firewall rule dynamically by reading a log file

Bash scripting: Apply a firewall rule dynamically by reading a log file

Some years ago, I needed to apply hundreds of firewall rules dynamically by reading a log file.
It was basically a DDos attack and the requests were easily identifyable since the attacker’s software was using the protocol HTTP/1.0.
I solved by pipeing some unix standard commands:  tail, grep, awk, iptables

Recap:

  • tail -f continuously reads  the log file
  • grep filters the rows containing  HTTP/1.0
  • awk extracts the attacker ip address and pass it to the firewall rule by the variable $1
Angular: Manually update a model from inside its custom validator avoiding loops

Angular: Manually update a model from inside its custom validator avoiding loops


I know, it could sound weird, in another post I will give more details about this need of mine.

Now I want to focus on the problem:
If you update a model inside its own custom validator, it will trigger the validator again in a devastaing loop.
I was looking for a way to update the model without to trigger the validator, so I played with the parameters of the two methods setValue and patchValue, but it did not work.

In the end, I decided to:

  1. validator to null
  2. update the value
  3. set the validator again.

It works well.

Does someone know a better way to achieve the result?

Angular: Manually update an input model but not the view

Angular: Manually update an input model but not the view


I’ve connected the google place autocomplete to an input field.

Well, while the input shows something like “Milano, MI, Italia”, I want to send to the API just the place_id (that the server will validate again by using the maps api)
Surely, I need to update the model and define a remote validator to set the field as valid.

The manual update is made by the setValue method.
By setting {emitModelToViewChange: false} I avoid the view gets updated.

That’s all!

 

How to calculate the file size from a base64 string in javascript

How to calculate the file size from a base64 string in javascript

A base64 string looks like this:
data:​image/​png;​base64,iVBORw0KGgoAAAANSUhEUg[…]

To calculate the size you have to:

  1. remove the header (data:​image/​png;​base64,)
  2. remove the “=” chars used as padding
  3. multiply for 3/4

The code:

Set a dynamic configuration object in the app by reading it from the server

Set a dynamic configuration object in the app by reading it from the server


What we are going to achieve is:

  1.  Having just one place (the server!) where to set some config parameters. (Those are useful for both server and client)
  2. If later we decide to change a parameter like the size limit of file uploading, we will just change it in the server, we will not have to change the app avoiding rebuildings, and the need of resubmitting it in the stores.
  3. The app keeps the config object in the local storage to avoid extra api calls, but refreshes it every time it starts.

First of all in the server I have a config file like:

I set AppConfig just with the values I want to share with the client app (I don’t want to share the whole configuration)

Add a route in koa like:

config_ctl looks like:

When I call my endpoint I get a Json string like:

Perfect, let’s move on the app.

First of all I create a new provider by using ionic-cli:

let’s edit /src/providers/config.ts

 

Things to notice:

  • Storage is a confortable interface to the SQLite db built-in all moder browsers (it has fallback, check http://ionicframework.com/docs/storage/)
  • I created a service to interact with my api, but you can use http directly.
  • I use async/await, no worries it is just like a Promise.

That the first time the service is used, the api call result is saved in the storage, all the next calls are resolved internally by reading the local storage and no further calls are performed.

The last thing we need to do is to refresh the storage when the app restarts.

we just insert in /src/app/app.component.ts

Now we can inject the service where we need to have the config parameters available.

For instance, In a custom validator of mine, I used the config service in this way:

That’s all!

JAVASCRIPT: Validating an alpha input field in an internation/multilangual project

JAVASCRIPT: Validating an alpha input field in an internation/multilangual project


Validating an alpha input field in an internation/multilangual project, is not easy as it seems.

Javascript does not support unicode out of the box.
Regex like /^[A-Za-z]$/ would never work with strings like 愚蠢的人讀了 or успокойсяЯпростопошутил

At the beginning I used something like:

It works, but everybody knows how important is to keep the code highly readable and as short as possible.
Languages like PHP have p{L} as equivalent of the previous poem, what about JS?

FINAL SOLUTION
I found a beautiful lib : https://github.com/slevithan/xregexp

We can simply use it like;
let myRegexp = XRegExp(‘^\\pL+$’);

This compiles in a standard js regex, plus the lib has a lot of really useful things, check it out.

 

Angular *ngfor: How to interate over an object

Angular *ngfor: How to interate over an object


Let’s suppose we receive from an api an object like:

*ngfor does not handle it out of the box, yet.
(I’ve seen some proposal on github)

The solution is to use a pipe.

If you use ionic-cli

Template

Controller
//nothing special here

Module

Pipe


 

Done 🙂