Affichage des articles dont le libellé est web. Afficher tous les articles
Affichage des articles dont le libellé est web. Afficher tous les articles

dimanche 10 janvier 2016

Dnssec chez vous

Cela faisait un certain temps que j'avais installé un résolveur DNS sur ma machine, tout d'abord parce que le DNS de mon fournisseur d'accès à Internet avait la fâcheuse tendance à planter, et ensuite parce que ça le fait d'aller interroger directement les serveurs racine.

Il y a quelques jours, ayant lu un article sur Dnssec, je me suis donc demandé si mon installation utilisait ce système qui permet de sécuriser la résolution de nom en s'assurant que personne de bidouille l'info, typiquement pour nous router vers un site de malware plutôt que le site recherché. Une rapide recherche m'amena vers un site de test qui me démontra que non. Retroussons nous donc les manches!

Déjà, il faut vérifier que votre résolveur fonctionne avec dnssec. Un petit "dig +dnssec" pour résoudre un nom qui supporte ce standard nous informe que c'est bon:

$ dig +dnssec http://www.dnssec-deployment.org/

; <<>> DiG 9.9.5-12.1-Debian <<>> +dnssec http://www.dnssec-deployment.org/
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 62323
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 6, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;http://www.dnssec-deployment.org/. IN  A

;; AUTHORITY SECTION:
.                       10797   IN      SOA     a.root-servers.net. nstld.verisign-grs.com. 2016011000 1800 900 604800 86400
.                       10797   IN      RRSIG   SOA 8 0 86400 20160120050000 20160110040000 54549 . MTlQxI92KqWfL5GsAk6eBL3T9KHsQIt3lWkC9jmiyYBl7+qCcOJUZOvG 4oEN1JizSsEhpp76oM0Fg9svRHryV5oZZr7Od2CHbI9jfuiYYPhvO16E o6EkPwoXZcnm6Y6JgLXKd/UOQK+J+WhlyqFP8swSgynv/FwvaRIFgkf/ cNw=
.                       10797   IN      RRSIG   NSEC 8 0 86400 20160120050000 20160110040000 54549 . uhX0FXBilUV7ZCP3sC/tPYVA5Srlu8MknbmGKZLLUf5FzRDH0tCk+HZb wy/2MGTnISsFnRftRgw4mR5tmBW6jgeYsR4PS46360GAqT1h5mvBAmHv gEE+5/g1kVsSi/MDJ075VduVHD+yMwCS5KZ/ynywsq7uj93gescPj+0V TbE=
.                       10797   IN      NSEC    aaa. NS SOA RRSIG NSEC DNSKEY
org.                    10797   IN      RRSIG   NSEC 8 1 86400 20160120050000 20160110040000 54549 . hPeKkCWTQbKtMBSDf/sGOnX1CHBXez4kuG2ulIc94USFgWR6Oz+R7OIs qCzjursXz+79hYd3HFrYFYX0KlWj08zpZHtTB4zz9TRoH1ep3ARoPWkR iyPDEkLgFyGlYnqQD3VuiIHQ478BUlgQ8vmKE/5REMsTXKIJxIG+kO95 YSs=
org.                    10797   IN      NSEC    organic. NS DS RRSIG NSEC

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Jan 10 15:40:46 GMT 2016
;; MSG SIZE  rcvd: 669

La présence de lignes RRSIG indique que la requête est revenue avec la signature demandée.

Maintenant, il suffit de configurer son résolveur pour que la résolution se fasse correctement. Avec bind9 sur Debian, c'est:

  • Ouvrir le fichier /etc/bind/named.conf.options
  • S'assurer que les 2 options dnssec-enable et dnssec-validation sont présentes
  • Mettre dnssec-enable à "yes" et dnssec-validation à "auto"

Mon fichier ressemble à cela:

options {
        directory "/var/cache/bind";
        dnssec-enable yes;
        dnssec-validation auto;
[...]

Notez que dnssec-validation doit être à "auto" et non à "yes", ce qui va lui permettre d'utiliser le fichier de signature présent avec la distribution. Avec l'option "yes", il faut en fournir un à la mimine.

Maintenant, redémarrez bind9. Un "dig www.dnssec-failed.org" devrait vous renvoyer un beau "status: SERVFAIL". Essayez également de visualiser le site depuis un navigateur, il devrait vous dire que le serveur n'a pu être trouvé. Yeah!

Petite astuce: assurez vous que le résolveur de noms de votre fournisseur est complètement ignoré, et pas simplement mis après votre résolveur local. Il m'a fallu enlever "domain-name-server" de mon dhclient.conf que la résolution DHCP ne charge pas le serveur DNS de mon fournisseur. Dans le doute, regardez votre resolv.conf.

mercredi 12 février 2014

Médoc de retour parmis les vivants!

Enfin! Il a fallu batailler pour comprendre les changements apportés à Eliom (la documentation mériterait quelques exemples supplémentaires), mais cette mise à jour est vraiment utile et rend le framework un petit peu plus facile à utiliser, une fois qu'on a compris le principe. J'ai pris quelques raccourcis pour réparer mon code, et il n'est donc pas d'une propreté à toute épreuve, mais l'ensemble du site fonctionne. Étrangement, les CSS ont eu l'air de souffrir un petit peu: en particulier, la liste des tags se déroule jusqu'à la fin de l'écran au lieu de passer à la ligne au bout du div. Également, ma section de login n'a pas l'air de prendre le style arrondi que les autres sections ont bien l'air de traiter.

Mais ce sont des détails. L'important est que Médoc soit enfin utilisable. Ouf!

Médoc dans les choux

Ces petits coquins de chez Ocsigen/Eliom, le framework de developpement Web basé sur Ocaml et qui fait fonctionner Médoc, ont fait de sérieuses mises à jour, que je n'ai pas suivies aussi assidument que je l'aurais dû... Résultat des courses, mon Médoc est par terre, et je ne peux plus accéder à mes documents, ce qui est plutôt ennuyeux pour une application qui se targue de gérer lesdits documents. C'est d'autant plus rageant que mon idée initiale, qui était de protéger les documents en les collant directement dans la base sous forme chiffrée plutôt qu'en vrac dans un dossier, protège maintenant trop bien.

J'ai découvert (un peu tard, et après m'être fait pas mal de cheveux) la page du changelog, et je suis en train de m'atteler à porter tout ça.

lundi 25 novembre 2013

Vaadin

Je code un petit peu en Vaadin, ces jours-ci. C'est un framework Web Java, qui fournit une abstraction de très haut niveau, orientée widgets, pour écrire des applications web "riches", comme on dit. Jetez un coup d'oeil à leur démo, c'est tout à fait étonnant. Derrière, dans le code, pas une once de HTML, et à peine un poil de javascript pour spécialiser quelques affichages. L'on peut donc tout écrire en Java, avec ses callbacks sur les différents événements GUI, et le framework génère HTML + Javascript + Jason pour faire tourner le tout. Notons tout de même qu'il faudra se plonger jusqu'au cou dans les CSS si l'on veut faire quelque chose qui s'éloigne du style de base.

Comme beaucoup de frameworks de ce type, tout se passe bien tant que l'on reste dans le moule, mais l'on doit se battre un peu lorsque l'on veut adapter certains comportements. En particulier, l'écriture de nouveaux widgets semble complexe.

Alors, bien sûr, il a fallu que je tâte un peu du Java (il ne faut pas dire "Fontaine, je ne boirai pas de ton eau"), et j'apprécie fortement les classes anonymes pour écrire ses callbacks. C'est presque aussi bien qu'un lambda :)

dimanche 10 juillet 2011

Debian, c'est comme attendre le bus...

On attend une version de gcc, et y'en a 3 qui arrivent en même temps :)

Maintenant qu'avec g++4.6, on a à peu près toutes les fonctionnalités de c++0x (c++11), j'attends maintenant avec impatience la mise à jour d'Iceweasel. Les web sockets m'intriguent, et bien qu'étant un peu allergique au Javascript, j'aimerais bien expérimenter avec des applications réellement réactives.

dimanche 11 octobre 2009

Médoc - Stable

Médoc est fini! Enfin, c'est un bien grand mot, mais disons qu'il est maintenant à un stade où il est utile pour moi, ce qui n'est déjà pas si mal. En dehors de fonctions de recherche plus avancées au niveau de l'interface web, qui seront aisées à ajouter, la partie la moins jolie est sans doute la petite application pour enregistrer le document dans la base. Puisque l'ensemble du projet est maintenant hébergé par OcamlCore, j'ai voulu écrire l'interface en utilisant Lablgtk, qui ne se prête pas vraiment à l'écriture d'une petite appli rapide, qui n'est qu'en fait qu'un front-end pour les programmes scanimage et convert, qui font le gros du boulot. Ce n'est donc ni très beau, ni très robuste.



L'interface web, elle, est utilisable, efficace (du moins pour un nombre réduit d'utilisateurs simultanés), et le système de tag fonctionne gentiment. J'ajoute presque chaque courrier administratif reçu au système, maintenant. On verra à l'usage!

lundi 21 septembre 2009

Le système de tags

Voilà, le système de tags est ajouté. L'on peut insérer de nouveaux tags, ou les supprimer d'un clic. Pour les tags qui n'existent pas encore, il est possible de taper leur nom directement.



Ce fut une belle plongée dans les CSS, et je suis maintenant à peu près satisfait de l'apparence générale de l'application. Il me reste maintenant à améliorer l'ajout de nouveaux documents, qui repose pour l'instant sur un script un petit peu fragile.

mardi 1 septembre 2009

Ocsigen - Images dynamiques

Voilà un sujet sur lequel il m'a fallu batailler ferme! C'est tout l'intérêt d'Ocaml: la difficulté est d'arriver à écrire du code qui compile. Une fois que le compilo est content, le code fonctionnera comme convenu. C'est exactement ce qui s'est passé avec mes images dynamiques.

Les documents et miniatures sont tous sauvés dans la base de données de Médoc. Quand bien même balancer ce genre de gros blobs à travers du SQL n'est pas franchement recommandé, je pense qu'il s'agissait là d'un des cas de figure autorisés. En effet, sauver ces images dans la base permet de centraliser toutes les données, ce qui simplifie la sauvegarde et la restauration et permet de laisser à la base le soin de chiffrer les données.

Cela veut dire qu'il faut pouvoir générer une image à partir d'un buffer binaire récupéré de la base. Ça tombe bien, Ocsigen sait envoyer du binaire via un Streamlist. Écrivons par exemple un service Ocsigen qui affiche une image à partir d'une chaîne binaire:


(* Petites déclarations ennuyeuses *)
open Lwt
open XHTML.M
open Eliom_services
open Eliom_parameters
open Eliom_sessions
open Eliom_predefmod.Xhtml

(* Déclaration du service, appelé "view", et qui prend *)
(* l'identifiant entier de l'image en paramètre *)
let view = Eliom_services.new_service ["view"] (int "id") ()

(* Initialisation du service *)
let _ = Eliom_predefmod.Streamlist.register view
(fun sp id () ->
return
([fun () ->
return (Ocsigen_stream.of_string (get_data id))],
"image/png"))

Il suffira d'écrire la fonction get_data qui prend dans notre cas l'identifiant entier de l'image à afficher, et qui retournera la chaîne contenant les données binaires de l'image.

Ce service peut ensuite être utilisé dans la déclaration d'un élément img:
 <img src="view?id=2"/>
pour afficher des images à l'intérieur d'une page (attention aux performances quand même, quand on va taper dans la base pour chaque image!).