Sam & Max » port http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 Écouter sur le port 80 sans être root 16 http://sametmax.com/ecouter-sur-le-port-80-sans-etre-root/ http://sametmax.com/ecouter-sur-le-port-80-sans-etre-root/#comments Wed, 28 Jan 2015 13:47:08 +0000 http://sametmax.com/?p=15817 Sous beaucoup d’OS, tous les ports d’un nombre inférieur à 1024 ne peuvent pas être utilisés par des processus sans avoir les privilèges administrateurs. Néanmoins, on a pas vraiment envie que son app bricolée un lendemain de cuite soit lancée en root, pour que la moindre faille de sécurité donne l’accès total à son système.

Beaucoup de logiciels se lancent en root, et relâchent leurs privilèges a posteriori. C’est ce que faisait Apache a une époque (peut être le fait-il toujours, j’ai pas cheché). Nginx lui, lance un processus racine en root, et spawn des enfants avec un utilisateur normal.

Mais nous, on a pas la foi de se faire chier à faire ça, donc généralement, on met nginx en front et il gère ça pour nous.

Sauf que, parfois, on a pas envie de mettre 40 couches devant notre app. Par exemple, si on utilise crossbar.io (ouai, j’ai encore réussi à le placer \o/), le logiciel est clairement capable d’être en front tout seul.

Bonne nouvelle, sur les Linux modernes, les exécutables peuvent avoir des permissions avancées, comme “pourvoir changer l’horloge système” ou “empêcher la mise en veille”. Ces permissions sont changeables avec l’outil setcap.

Sous Ubuntu, ça s’installe avec :

sudo apt-get install libcap2-bin

Puis on choisit l’exécutable à qui on veut donner nos nouvelles permissions. Dans mon cas, le Python du virtualenv de mon projet :

$ pew workon super_projet
$ which python
/home/sam/.local/share/virtualenvs/super_projet/bin/python

Je check si il a pas déjà des permissions (normalement non) :

$ sudo getcap `which python`

Nada. Good.

Un petit coup de man setcap nous liste les permissions utilisables, et on peut voire que CAP_NET_BIND_SERVICE est la permission qui permet d’autoriser un exécutable à binder n’importe quel port.

On rajoute les permissions :

sudo setcap cap_net_bind_service=+ep `which python`

On check que les permissions ont bien été ajoutées :

$ sudo getcap `which python`
/home/sam/.local/share/virtualenvs/super_projet/bin/python = cap_net_bind_service+eip

On a rajouté avec le + la permission cap_net_bind_service pour les cas e et p qui correspondent aux premières lettres de ces définitions :

Permitted (formerly known as forced):
    These capabilities are automatically permitted to the thread, regardless of the thread's inheritable capabilities. 

Inheritable (formerly known as allowed):
    This set is ANDed with the thread's inheritable set to determine which inheritable capabilities are enabled in the permitted set of the thread after the execve(2). 

Effective:
    This is not a set, but rather just a single bit. If this bit is set, then during an execve(2) all of the new permitted capabilities for the thread are also raised in the effective set. If this bit is not set, then after an execve(2), none of the new permitted capabilities is in the new effective set.

Et je n’ai absolument rien compris à celles-ci, je sais juste que ça marche.

Voilà, maintenant tout ce que vous lancez avec le Python de ce virtualenv peut se binder au port 80.

Si vous n’aimez pas l’idée de donner cette permission à tout un Python, il existe une alternative : rediriger tout ce qui rentre sur le port 80 vers un autre port.

Pour ça on peut utiliser un autre soft :

sudo apt-get install socat

Par exemple, balancer tout le trafic du port 80 vers le port 8080 :

socat tcp-listen:80,fork,reuseaddr tcp:localhost:8080

Et pouf, votre appli qui écoute sur le port 8080 reçoit le trafic du port 80.

C’est plus simple, mais il faut le faire pour chaque port, et s’assurer que la commande est bien lancée au démarrage du serveur.

]]>
http://sametmax.com/ecouter-sur-le-port-80-sans-etre-root/feed/ 16
Savoir quels programmes écoutent sur quels ports de votre serveur avec Netstat 8 http://sametmax.com/savoir-quels-programmes-ecoutent-sur-quels-ports-de-votre-serveur-avec-netstat/ http://sametmax.com/savoir-quels-programmes-ecoutent-sur-quels-ports-de-votre-serveur-avec-netstat/#comments Fri, 18 May 2012 17:21:03 +0000 http://sametmax.com/?p=633 Comme je teste pas mal d’applications je me retrouve souvent à avoir nginx, apache, cherokee installés sur la même machine, or des fois j’oublie sur quels ports ils écoutent et m’étonne de ne pouvoir lancer ma nouvelle config nginx toute fraîche alors que l’un des deux autres écoute sur le même port.

Heureusement la plupart des applications vous préviennent que quelqu’un est déjà sur ce port, oui mais qui ?

Pour avoir un rapide coup d’oeil sur les ports utilisés faites:

netstat -ntpul
 
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      26586/lighttpd
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      30945/sshd
tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      715/snmpd
tcp        0      0 88.234.212.132:3306         0.0.0.0:*                   LISTEN      15186/mysqld
tcp        0      0 127.0.0.1:6379              0.0.0.0:*                   LISTEN      31841/redis-server
tcp        0      0 :::8080                     :::*                        LISTEN      6951/java
tcp        0      0 :::8181                     :::*                        LISTEN      29022/cherokee-work
tcp        0      0 :::22                       :::*                        LISTEN      30945/sshd
tcp        0      0 :::3399                     :::*                        LISTEN      11438/(squid)
udp        0      0 0.0.0.0:161                 0.0.0.0:*                               715/snmpd
udp        0      0 0.0.0.0:50931               0.0.0.0:*                               11438/(squid)
udp        0      0 :::43815                    :::*                                    11438/(squid)

les options:

-n, –numeric

affiche les adresses en format numérique au lieu d’essayer de déterminer le nom symbolique d’hôte, de port ou d’utilisateur.

-p, –programs

affiche le nom et le PID des processus propriétaires de chaque socket décrite. Vous devez être le propriétaire d’un processus pour visualiser les sockets qui lui appartiennent ou être l’utilisateur root pour disposer de toutes les informations.

-l, –listening

Affiche les sockets en écoute

-t

Affiche les connexion TCP

-u

Affiche les connexion UDP

EDIT: On me signale un super moyen mémotechnique de retenir un panel d’options (merci Gardouille):

netstat -lapute

A vous Cognack-Jay

]]>
http://sametmax.com/savoir-quels-programmes-ecoutent-sur-quels-ports-de-votre-serveur-avec-netstat/feed/ 8