{"id":429,"date":"2019-02-17T19:44:12","date_gmt":"2019-02-17T18:44:12","guid":{"rendered":"https:\/\/corsaire-consulting.fr\/blog\/?p=429"},"modified":"2019-02-17T19:44:12","modified_gmt":"2019-02-17T18:44:12","slug":"surveillance-des-applications-java-securite","status":"publish","type":"post","link":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/2019\/02\/17\/surveillance-des-applications-java-securite\/","title":{"rendered":"Surveillance des applications Java &#038; S\u00e9curit\u00e9"},"content":{"rendered":"<p>Les applications Java peuvent \u00eatre surveill\u00e9es gr\u00e2ce \u00e0 la technologie <a href=\"https:\/\/www.oracle.com\/technetwork\/java\/javase\/tech\/javamanagement-140525.html\" target=\"_blank\" rel=\"noopener\">JMX<\/a>, via des outils comme <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/technotes\/guides\/management\/jconsole.html\" target=\"_blank\" rel=\"noopener\">JConsole<\/a> ou <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/technotes\/guides\/visualvm\/\" target=\"_blank\" rel=\"noopener\">JVisualVM<\/a> ou n&rsquo;importe quel programme Java utilisant l&rsquo;API JMX. Cette technologie permet \u00e9galement de modifier la configuration d&rsquo;une application Java.<\/p>\n<p>Dans la pratique la JVM expose un serveur <a href=\"https:\/\/www.oracle.com\/technetwork\/java\/javase\/tech\/javamanagement-140525.html\" target=\"_blank\" rel=\"noopener\">JMX<\/a> auquel il est possible de se connecter localement (depuis la m\u00eame machine) ou \u00e0 distance. Elle permet de consulter le comportement de la JVM (threads, cpu, heap, etc&#8230;) ou de consulter et modifier sa configuration. <a href=\"https:\/\/www.oracle.com\/technetwork\/java\/javase\/tech\/javamanagement-140525.html\" target=\"_blank\" rel=\"noopener\">JMX<\/a> constitue donc une porte d&rsquo;entr\u00e9e particuli\u00e8rement sensible vers une application Java. Cet acc\u00e8s doit \u00eatre prot\u00e9g\u00e9 afin que seules les personnes ou applications habilit\u00e9s puissent l&rsquo;utiliser.<\/p>\n<p>Cet article se propose de montrer comment s\u00e9curiser la relation entre un outil tel que <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/technotes\/guides\/management\/jconsole.html\" target=\"_blank\" rel=\"noopener\">JConsole<\/a> ou <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/technotes\/guides\/visualvm\/\" target=\"_blank\" rel=\"noopener\">JVisualVM<\/a> et une application java, qu&rsquo;elle tourne dans un serveur j2ee ou non.<\/p>\n<p><!--more--><\/p>\n<p>Il existe plusieurs niveaux de configuration qu&rsquo;on met en jeu avec les propri\u00e9t\u00e9s com.sun.management.jmxremote.xxxx :<\/p>\n<h1>Fermeture des acc\u00e8s locaux et distants.<\/h1>\n<p>Les acc\u00e8s JMX sont impossibles depuis l&rsquo;ext\u00e9rieur de la JVM que ce soit en local depuis la m\u00eame machine ou depuis une autre machine. Seule une application se trouvant dans la m\u00eame JVM que l&rsquo;application Java pourra acc\u00e9der \u00e9ventuellement aux fonctions JMX.<\/p>\n<p>[pastacode lang=\u00a0\u00bbjava\u00a0\u00bb manual=\u00a0\u00bb-Dcom.sun.management.jmxremote%3Dfalse\u00a0\u00bb message=\u00a0\u00bb\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<p>&nbsp;<\/p>\n<h1>Acc\u00e8s local uniquement, non s\u00e9curis\u00e9<\/h1>\n<ul>\n<li>Le serveur JMX de l&rsquo;application est joignable uniquement en local.<\/li>\n<li>Aucune authentification n&rsquo;est requise pour se connecter au serveur.<\/li>\n<li>Le client utilise l&rsquo;<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/jdk\/api\/attach\/spec\/index.html\" target=\"_blank\" rel=\"noopener\">API Java Attach.<\/a><\/li>\n<\/ul>\n<p>[pastacode lang=\u00a0\u00bbjava\u00a0\u00bb manual=\u00a0\u00bb-Dcom.sun.management.jmxremote\u00a0\u00bb message=\u00a0\u00bb\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<div class=\"alert alert-block alert-warning\" style=\"text-align: center;\">C&rsquo;est la configuration par d\u00e9faut.<\/div>\n<h1>Acc\u00e8s locaux et distants, non s\u00e9curis\u00e9s<\/h1>\n<ul>\n<li>Le serveur JMX de l&rsquo;application java est joignable en local et \u00e0 distance.<\/li>\n<li>Pas d&rsquo;authentification du client aupr\u00e8s de l&rsquo;application Java<\/li>\n<li>Pas d&rsquo;authentification l&rsquo;application Java aupr\u00e8s du client.<\/li>\n<li>Pas de chiffrement des communications avec SSL\/TLS<\/li>\n<\/ul>\n<p>[pastacode lang=\u00a0\u00bbjava\u00a0\u00bb manual=\u00a0\u00bb-Dcom.sun.management.jmxremote.port%3D6229%0A-Dcom.sun.management.jmxremote.authenticate%3Dfalse%0A-Dcom.sun.management.jmxremote.ssl%3Dfalse\u00a0\u00bb message=\u00a0\u00bb\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<p>C&rsquo;est la propri\u00e9t\u00e9 com.sun.management.jmxremote.port qui permet d&rsquo;activer l&rsquo;acc\u00e8s distant.<\/p>\n<p>Ne pas oublier d&rsquo;ouvrir le port (6229 dans l&rsquo;exemple) au niveau des pare-feux.<\/p>\n<h1>Acc\u00e8s local et distant &#8211; One-way SSL<\/h1>\n<ul>\n<li>Le serveur JMX de l&rsquo;application Java est joignable en local et \u00e0 distance.<\/li>\n<li>Pas d&rsquo;authentification du client aupr\u00e8s de l&rsquo;application Java<\/li>\n<li>Authentification de l&rsquo;application Java aupr\u00e8s du client avec un certificat \u00e9lectronique (One-way SSL).<\/li>\n<\/ul>\n<p>[pastacode lang=\u00a0\u00bbjava\u00a0\u00bb manual=\u00a0\u00bb-Dcom.sun.management.jmxremote.port%3D6229%0A-Dcom.sun.management.jmxremote.authenticate%3Dfalse%0A-Dcom.sun.management.jmxremote.ssl%3Dtrue\u00a0\u00bb message=\u00a0\u00bb\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<h1>Acc\u00e8s local et distant &#8211; Authentification client par mot de passe<\/h1>\n<ul>\n<li>Le serveur JMX de l&rsquo;application Java est joignable en local et \u00e0 distance.<\/li>\n<li>Le client doit s&rsquo;authentifier aupr\u00e8s du serveur JMX de l&rsquo;application Java avec un mot de passe.<\/li>\n<li>Pas d&rsquo;authentification de l&rsquo;application java aupr\u00e8s du client JMX.<\/li>\n<li>Pas de chiffrement des communications avec SSL\/TLS<\/li>\n<\/ul>\n<p>[pastacode lang=\u00a0\u00bbjava\u00a0\u00bb manual=\u00a0\u00bb-Dcom.sun.management.jmxremote.port%3D6229%0A-Dcom.sun.management.jmxremote.authenticate%3Dtrue%0A-Dcom.sun.management.jmxremote.ssl%3Dfalse\u00a0\u00bb message=\u00a0\u00bb\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<p>Il est possible de configurer un login module JAAS ou d&rsquo;indiquer les mots de passe dans un fichier dans la configuration de la JVM. Les d\u00e9tails sont disponibles dans cette <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/technotes\/guides\/management\/agent.html\" target=\"_blank\" rel=\"noopener\">documentation<\/a>. En cas d&rsquo;utilisation du fichier il faut savoir que les mots de passe sont stock\u00e9s en clair sur le disque dur.<\/p>\n<h1>Acc\u00e8s local et distant &#8211; Two-way SSL<\/h1>\n<ul>\n<li>Le serveur JMX de l&rsquo;application Java est joignable en local et \u00e0 distance.<\/li>\n<li>Le client doit s&rsquo;authentifier aupr\u00e8s du serveur JMX de l&rsquo;application Java avec un certificat \u00e9lectronique.<\/li>\n<li>Authentification de l&rsquo;application java aupr\u00e8s du client JMX avec un certificat \u00e9lectronique<\/li>\n<li>Chiffrement des communications avec SSL\/TLS<\/li>\n<\/ul>\n<p>[pastacode lang=\u00a0\u00bbjava\u00a0\u00bb manual=\u00a0\u00bb-Dcom.sun.management.jmxremote.port%3D6229%0A-Dcom.sun.management.jmxremote.authenticate%3Dfalse%0A-Dcom.sun.management.jmxremote.ssl%3Dtrue%0A-Dcom.sun.management.jmxremote.ssl.need.client.auth%3Dtrue\u00a0\u00bb message=\u00a0\u00bb\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<p>&nbsp;<\/p>\n<p>Les configurations mettant en jeu SSL\/TLS vont donc n\u00e9cessiter la configuration des \u00e9l\u00e9ments suivants :<\/p>\n<ul>\n<li>One-Way SSL\n<ul>\n<li>Une paire de clef publique\/priv\u00e9e et d&rsquo;un certificat (auto-sign\u00e9 \u00e9ventuellement) pour l&rsquo;application Java<\/li>\n<li>Un keystore (identity) c\u00f4t\u00e9 application Java pour stocker les clefs et le certificat du serveur<\/li>\n<li>Un keystore (trust) c\u00f4t\u00e9 client JMX pour stocker la clef publique et le certificat du serveur<\/li>\n<\/ul>\n<\/li>\n<li>Two-Way SSL\n<ul>\n<li>Une paire de clef publique\/priv\u00e9e et d&rsquo;un certificat (auto-sign\u00e9 \u00e9ventuellement) pour l&rsquo;application Java<\/li>\n<li>\u00a0Une paire de clef publique\/priv\u00e9e et d&rsquo;un certificat (auto-sign\u00e9 \u00e9ventuellement) pour le client JMX (JConsole par exemple)<\/li>\n<li>C\u00f4t\u00e9 Application Java\n<ul>\n<li>Un keystore (identity) pour stocker les clefs et le certificat du serveur<\/li>\n<li>Un keystore (trust) pour stocker la clef publique et le certificat du client JMX<\/li>\n<\/ul>\n<\/li>\n<li>C\u00f4t\u00e9 Client JMX\n<ul>\n<li>Un keystore (identity) pour stocker les clefs et le certificat du client JMX<\/li>\n<li>Un keystore (trust) pour stocker la clef publique et le certificat du serveur<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h1>Conclusion<\/h1>\n<p>Si l\u00a0\u00bbacc\u00e8s JMX \u00e0 l&rsquo;application n&rsquo;est pas n\u00e9cessaire, pensez \u00e0 le d\u00e9sactiver compl\u00e8tement afin de verrouiller \u00e9galement les acc\u00e8s locaux.<\/p>\n<p>Si cet acc\u00e8s est n\u00e9cessaire, seule la s\u00e9curisation two-way SSL permet d&rsquo;avoir une s\u00e9curit\u00e9 maximale en mettant en jeu la double authentification et le chiffrement des donn\u00e9es \u00e9chang\u00e9es entre le client JMX et l&rsquo;application \u00e0 surveiller.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les applications Java peuvent \u00eatre surveill\u00e9es gr\u00e2ce \u00e0 la technologie JMX, via des outils comme JConsole ou JVisualVM ou n&rsquo;importe quel programme Java utilisant l&rsquo;API JMX. Cette technologie permet \u00e9galement de modifier la configuration d&rsquo;une application Java. Dans la pratique la JVM expose un serveur JMX auquel il est possible de se connecter localement (depuis [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":436,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[7,59,41,42],"tags":[38,68,70,69,56,46,43],"class_list":["post-429","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","category-securite","category-ssl","category-ssl-tls","tag-java","tag-jconsole","tag-jmx","tag-jvisualvm","tag-securite","tag-serveur","tag-ssl"],"_links":{"self":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/429","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=429"}],"version-history":[{"count":16,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/429\/revisions"}],"predecessor-version":[{"id":446,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/429\/revisions\/446"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/media\/436"}],"wp:attachment":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}