All posts tagged Linux Access

Les funcions de memòria compartida que suporta el PHP són una bona manera de gestionar indicadors de les aplicacions a nivell de sistema.

Es tracta d’una manera de tenir variables superglobals, és a dir, consultables per tots els scripts de l’aplicació. Realment el que estem fent és accedir directament a blocs de memòria del servidor, convenientment reservat i assegurat.

L’alternativa a aquesta gestió d’indicadors en memòria compartida són els tradicionals accessos al filesystem amb arxius semàfors.

Però si la gestió d’aquesta memòria ens resulta fartosa, sobretot per haver de fer sempre un shmop_read() i controlar l’error per saber si una posició està ocupada o lliure, si el PHP s’executa en un servidor Linux, podem fer servir les funcions semàfor que faciliten la programació amb aquesta tècnica.

shm_attach
La instrucció shm_attach ens permet tractar els segments de memòria amb una facilitat tant gran que a cops sembla que estiguem tractant amb arxius tipus semàfor.

Per reservar un segment executarem:
$this->seg = shm_attach(0xCAFE, 1024, 0750);

El primer paràmetre és l’id de segment de memòria amb el que volem treballar. En aquest exemple fem servir un de proves, però en explotació podríem fer servir la funció ftok(__FILE__), si aquest segment el reservem per a tota l’aplicació des d’un únic arxiu, o ftok(‘/etc/app/myapp.ini’) on indiquem la ruta de l’arxiu que conté la configuració per a l’aplicació i que s’estima únic per a la mateixa aplicació.

El segon paràmetre és la mida en bytes d’aquest segment, reservem un KB. Cal tenir en compte a l’hora de dimensionar segments, que PHP a hores d’ara encara no és un llenguatge nativament UTF-8.

El tercer paràmetre estableix els permisos d’aquest segment en format octal. Per omissió és 0666, però com que no volem que cap altre usuari del sistema que no sigui l’Apache, els del seu grup puguin llegir-ho, però la resta ni pugui conèixer la seva existència, establim permisos 0750.

shm_put_var
La instrucció shm_put_var serveix per a establir un valor a un slot del segment reservat.
shm_put_var($this->seg, (int) $clau, $valor);

El primer paràmetre és l’id del segment.

El segon, l’slot del segment que volem declarar.

El tercer, és el valor pròpiament dit.

shm_get_var
La instruccio shm_get_var serveix per a recuperar un valor d’un slot del segment reservat.
if (shm_has_var($this->seg, $clau))
{
return shm_get_var($this->seg, (int) $clau);
}

El primer paràmetre és l’id del segment.

El segon, l’slot del segment que volem recuperar. Podem fer servir shm_has_var per tractar d’esbrinar prèviament si està declarat o no aquest slot.

Benchmark
Les proves de rendiment que hem fet comparant aquesta tècnica amb accessos a arxius tipus semàfor al filesystem ens han reportat una mitjana de 60 cops més ràpid l’accés a memòria compartida, que a arxius del filesystem tant per a l’establiment de variables, com per a la recuperació d’aquestes.

Una dada a tenir en compte!

ubuntu-upgrade

Per actualitzar els servidors Ubuntu 8.04 LTS a la següent LTS, la 10.04 d’una tacada, hem de seguir aquestes pases amb la màquina dedicada per a nosaltres (cal reinicar diversos cops):

- Actualitzar el nostre sistema a la darrera versió de la seva release i reniciem per aplicar canvis en el kernel si hi son:
sudo apt-get update
sudo apt-get upgrade
sudo shutdown -r now

Si normalment actualitzem el sistema, amb un cop n’hi haurà prou, si no, cal repetir aquest procediment fins assegurar-nos estar a la darrera versió.

- Instal·lem l’update manager core, si és que no el tenim ja:
sudo apt-get install update-manager-core
I ens assegurem que la configuració a l’arxiu /etc/update-manager/release-upgrades indica que únicament actualitzi a versions LTS:
Prompt=lts

- Iniciem la actualització
sudo do-release-upgrade --proposed
I seguim les instruccions de la pantalla

Captura-phpdoc-GHex

Instal·lant la darrera versió del generador de documentació PhpDocumentor, ens hem trobat que l’script phpdoc peta per

bash: ./phpdoc: /bin/sh^M: bad interpreter: No such file or directory

L’error rau en que l’script es va programar en un editor de windows que ha desat el x’0d0a’ per salt de línia que l’intèrpret de comandes de Linux li costa de gestionar.

Hi ha diferents maneres de solucionar aquest problema, una és executant la utilitat dos2unix, si no la tenim la instal·lem amb:

sudo apt-get install tofrodos

I procedim a la conversió de l’script phpdoc

dos2unix phpdoc

I ara que ja tenim l’script amb un únic i necessari x’0a’

Procedim a provar el PhpDocumentor generant la seva pròpia documentació

./phpdoc -c makedocs

Per canviar permissos d’arxius en Linux emprem chmod i el tipus de permís que volem atorgar:

ugo/a -> per a user, group, other i all
rwxs -> per a read, write, execute i suid

També hi ha la manera octal de representació d’aquests permisos i s’empra sobretot en les màqueres de creació d’arxius en sistemes de fitxers externs i samba per exemple.

És el que es coneix com a sistema octal, el primer dígit de la dreta per a other, el segon per a group i el tercer per a user.

Cada xifra el que vol dir:

7 -> rwx read, write, execute (+rwx)
6 -> rw- read, write (-x+rw)
5 -> r-x read, execute (-w+rx)
4 -> r-- read (-wx+r)
3 -> -wx write, execute (-r+wx)
2 -> -w- write (-rx+w)
1 -> --x execute (-rw+x)
0 -> --- no permissions (-rwx)

Captura-MySQL-Query-Browser

De vegades, ja sigui per seguretat o per necessitat de saltar-se proteccions d’accés a xarxa de servidors MySQL, necessitem accedir-hi al servidor a través d’un tunel assegurat amb ssh.

Seguin les passes indicades per Marion Bates a l’article MySQL ssh tunnel Quickstart crearem ràpidament una connexió per ssh cap a un servidor MySQL.

Només cal picar en una terminal:

ssh -L 3307:nom.servidor.mysql:3306 usuari@nom.servidor.ssh

Això obre un tunel a localhost:3307 que apunta al servidorMySQL:3306 via connexió ssh.
Hem indicat el port local 3307 pq a la màquina on fem això tenim un servidor MySQL de proves.
Si la màquina oberta a ssh és la mateixa que te el servidor MySQL, nom.servidor.mysql serà localhost.
Aquesta connexió la deixarem oberta, mentre estigui activa la terminal, estarà actiu el tunel.
Per a connectar-nos, obrim el MySQL QueryBrowser i indiquem host 127.0.0.1, port el 3307 i un usuari i contrasenya vàlid per a connectar-se a la base de dades MySQL.
captura-Team-Viewer-per-a-Linux

Ja està disponible la versió per a Linux (βeta) del capturador d’escriptoris remot TeamViewer.

Hi ha un paquet de TeamViewer per a Ubuntu de 32 i de 64 bits. A Corretgé.com hem provat, molt satisfactòriament, el TeamViewer de 32 bits.

TeamViewer permet la captura d’escriptoris sense haver de modificar routers i firewalls, si es te accés a la navegació per InterNet, es pot fer servir TeamViewer.

TeamViewer encripta la sessió amb una codificació de 256-bit AES.

Fins ara es podia fer servir el TeamViewer via Wine, només per a capturar escritoris d’altri.

Es tracta d’una molt bona notícia! Gràcies TeamViewer!

sf_name

Skipfish és un scanner de vulnerabilitats en aplicacions web de Google.

És força ràpid (prop de 2000 peticions per segon a una LAN) i exhaustiu, li farem un seguiment sobretot per la senzillesa a l’hora d’executar-ho.

Per a instal·lar-ho a Ubuntu, cal descarregar el programa des del Google Code SkipFish i descomprimir-ho.

Prèviament necessitarem tenir instal·lades algunes llibreries, farem:
sudo apt-get install apt-get install libssl-dev zlibc zlib-bin libidn11-dev libidn11

I iniciarem la compilació de l’aplicació amb un senzill
make

Copiem el diccionari a emprar, com que estem fent proves ho fem amb el complete :-)
cp dictionaries/complete.wl ./skipfish.wl

I procedim a fer el test de seguretat
./skipfish -o ../test.skipfish http://url.projecte.dev

Amb l’opció C podem indicar una cookie que contingui l’ID de sessió. És a dir que podem loginejar-nos normalment i un cop autentificats, executar l’scanner.

És important que les primeres proves les fem en entorns de desenvolupament local i desconnectem els logs del servidor web, no sigui cas que iniciem un auto atac DoS!

Una revisió complerta d’un web relativament petit, en xarxa local amb infraestructura a Gigabit, ha trigat més de 12 hores.

Una curiositat: per temes de seguretat el resultat no es visualitza correctament amb el Chromium i sí amb el Firefox si s’executa directament desde file://. Per a visualitzar-ho desde Safari o Chrome cal posar el resultat en una carpeta gestionada per un servidor web.

Aquesta setmana hem rebut al despatx de Corretgé.com l’esplèndid PHP Security Poster editat per l’empresa alemanya especialitzada en seguretat SektionEins.

SektionEins és l’empresa que ha creat el paquet de seguretat Suhosin. Si hem instal·lat el PHP desde la paqueteria d’Ubuntu, al fer un phpinfo(), segurament veurem que al PHP instal·lat se li ha aplicat el patch de Suhosin, és fàcil de detectar, per les lletres en coreà 수호신 al final de la plana, que ve a ser la traducció de una deïtat guardiana… sí, és la traducció literal, no és cap de les deïtats guardianes que el budisme assigna segons l’any de naixement a la seva parròquia.

Suhosin logoThis server is protected with the Suhosin Patch 0.9.6.2
Copyright (c) 2006 Hardened-PHP Project

Així doncs, els ubuntaires ja tenim el PHP preparat de sèrie per al Suhosin i no hem de compilar ni aplicar cap patch.
Per a instal·lar aquesta extensió de PHP, farem

sudo apt-get install php5-suhosin

A /etc/php5/apache2/conf.d/suhosin.ini podrem parametritzar aquest guardià protector.

En properes edicions comentarem alguns dels paràmetres de configuració:


Directive Local Value Master Value
suhosin.apc_bug_workaround Off Off
suhosin.cookie.checkraddr 0 0
suhosin.cookie.cryptdocroot On On
suhosin.cookie.cryptkey [ protected ] [ protected ]
suhosin.cookie.cryptlist no value no value
suhosin.cookie.cryptraddr 0 0
suhosin.cookie.cryptua On On
suhosin.cookie.disallow_nul 1 1
suhosin.cookie.disallow_ws 1 1
suhosin.cookie.encrypt Off Off
suhosin.cookie.max_array_depth 50 50
suhosin.cookie.max_array_index_length 64 64
suhosin.cookie.max_name_length 64 64
suhosin.cookie.max_totalname_length 256 256
suhosin.cookie.max_value_length 10000 10000
suhosin.cookie.max_vars 100 100
suhosin.cookie.plainlist no value no value
suhosin.coredump Off Off
suhosin.disable.display_errors Off Off
suhosin.executor.allow_symlink Off Off
suhosin.executor.disable_emodifier Off Off
suhosin.executor.disable_eval Off Off
suhosin.executor.eval.blacklist no value no value
suhosin.executor.eval.whitelist no value no value
suhosin.executor.func.blacklist no value no value
suhosin.executor.func.whitelist no value no value
suhosin.executor.include.blacklist no value no value
suhosin.executor.include.max_traversal 0 0
suhosin.executor.include.whitelist no value no value
suhosin.executor.max_depth 0 0
suhosin.filter.action no value no value
suhosin.get.disallow_nul 1 1
suhosin.get.disallow_ws 0 0
suhosin.get.max_array_depth 50 50
suhosin.get.max_array_index_length 64 64
suhosin.get.max_name_length 64 64
suhosin.get.max_totalname_length 256 256
suhosin.get.max_value_length 512 512
suhosin.get.max_vars 100 100
suhosin.mail.protect 0 0
suhosin.memory_limit 0 0
suhosin.mt_srand.ignore On On
suhosin.multiheader Off Off
suhosin.perdir 0 0
suhosin.post.disallow_nul 1 1
suhosin.post.disallow_ws 0 0
suhosin.post.max_array_depth 50 50
suhosin.post.max_array_index_length 64 64
suhosin.post.max_name_length 64 64
suhosin.post.max_totalname_length 256 256
suhosin.post.max_value_length 65000 65000
suhosin.post.max_vars 200 200
suhosin.protectkey On On
suhosin.request.disallow_nul 1 1
suhosin.request.disallow_ws 0 0
suhosin.request.max_array_depth 50 50
suhosin.request.max_array_index_length 64 64
suhosin.request.max_totalname_length 256 256
suhosin.request.max_value_length 65000 65000
suhosin.request.max_varname_length 64 64
suhosin.request.max_vars 200 200
suhosin.server.encode On On
suhosin.server.strip On On
suhosin.session.checkraddr 0 0
suhosin.session.cryptdocroot On On
suhosin.session.cryptkey [ protected ] [ protected ]
suhosin.session.cryptraddr 0 0
suhosin.session.cryptua On On
suhosin.session.encrypt On On
suhosin.session.max_id_length 128 128
suhosin.simulation Off Off
suhosin.sql.bailout_on_error Off Off
suhosin.sql.comment 0 0
suhosin.sql.multiselect 0 0
suhosin.sql.opencomment 0 0
suhosin.sql.union 0 0
suhosin.sql.user_postfix no value no value
suhosin.sql.user_prefix no value no value
suhosin.srand.ignore On On
suhosin.stealth On On
suhosin.upload.disallow_binary 0 0
suhosin.upload.disallow_elf 1 1
suhosin.upload.max_uploads 25 25
suhosin.upload.remove_binary 0 0
suhosin.upload.verification_script no value no value