Eléments de sécurité sur les mots de passe et Cryptage des
Transcription
Eléments de sécurité sur les mots de passe et Cryptage des
Eléments de sécurité sur les mots de passe et Cryptage des données en transit Mouhamadou Diaw, Senior Oracle Consultant, dbi services ltd. Introduction Avec l’augmentation exponentielle des données électroniques, la protection des données et l’adoption des bonnes pratiques pour la manipulation de ces données deviennent vitales. Le but de ce document est de présenter quelques éléments de sécurité permettant de limiter les risques dans un environnement oracle. Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit Sécuriser ma configuration Choisir une bonne ligne directrice Il ne s’agit pas de réinventer le monde, mais de se baser sur ce qui existe déjà. En effet plusieurs organismes proposent les grandes lignes à suivre pour une configuration sécurisée respectant les normes de sécurité en vigueur. Parmi ces organismes on peut citer deux principaux organismes qui proposent des documents sur les bonnes pratiques pour l’implémentation d’une base de données oracle : Le premier est le STIG (Database Security Technical Implementation Guide) développé par le DISA (Defense Information Systems Agency) http://iase.disa.mil/stigs/app-security/database/Pages/oracle.aspx Le deuxième organisme est le CIS (Centre for Internet Security) https://www.cisecurity.org/ On peut utiliser soit l’un de ces documents ou les deux. Utilisation d’un outil d’évaluation de la vulnérabilité L’utilisation des checklists proposés par le STIG et le CIS peut vite devenir fastidieuse, en effet plusieurs sujets sont abordés. Et souvent plusieurs modifications sont nécessaires. Et cela peut prendre beaucoup de temps. Heureusement il existe des outils pour automatiser toutes ces tâches, on les appelle Vulnerabilty Assessment Tool. On en trouve plusieurs sur le marché : AppDetective, AppSecurity, NGS Squirrel, Guardium, Scuba Imperva. Figure 1 Figure 2 Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit Une bonne politique de mots de passe Nous allons maintenant voir quelques éléments faciles à mettre en œuvre et qui peuvent aider à protéger notre base oracle. Une base oracle 11.2.0.4 est utilisée pour les démonstrations. Un bon choix de mots de passe Les mots de passe étant le premier levier pour accéder à la base, il convient d’adopter une procédure de gestion rigoureuse Les mots de passe de SYS et SYSTEM doivent être différents Les mots de passe des environnements doivent être différents (Développement, Test et Production) Changer les mots de passe régulièrement Mettre en place la fonction de validation des mots de passe. Oracle en fournit une. http://blog.dbi-services.com/protect-your-oracle-password-function/ Le choix d’un bon mot de passe est vital vu qu’un mot de passe simple se brise assez facilement Exemple 1 : Dans cet exemple on a choisi root comme mot de passe de SYS et de SYSTEM Récupérons maintenant les hash correspondants (Listing 1) SQL> select password from sys.user$ where name in ('SYS','SYSTEM'); PASSWORD -----------------------------4308B3327406F339 C878FEAFB91DF2F7 Listing 1 Avec ces valeurs hash on crée un fichier texte de la forme (Listing 2) # cat fichier_hash.txt SYS:4308B3327406F339 SYSTEM:C878FEAFB91DF2F7 Listing 2 En utilisant la version basique de john the ripper et lui passant le fichier, le mot de passe est restitué assez rapidement (Listing 3). # john --format=oracle ./fichier_hash.txt Loaded 2 password hashes with 2 different salts (Oracle [oracle]) Warning: mixed-case charset, but the current hash type is case-insensitive; some candidate passwords may be unnecessarily tried more than once. ROOT (SYSTEM) ROOT (SYS) guesses: 2 time: 0:00:00:01 DONE (Wed Apr 27 13:16:59 2016) c/s: 749545 trying: Listing 3 Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit Exemple 2 : Dans le deuxième cas on utilise un mot de passe un peu plus long mais composé uniquement de lettre : resiste. Là aussi le résultat est effarant, le mot de passe est retourné en un temps record (Listing 4) [root@stand2 soug_john]# john --format=oracle ./toto_hash.txt Loaded 1 password hash (Oracle [oracle]) Warning: mixed-case charset, but the current hash type is case-insensitive; some candidate passwords may be unnecessarily tried more than once. RESISTE (TOTO) guesses: 1 time: 0:00:00:37 DONE (Wed Apr 27 13:57:04 2016) c/s: 982843 trying: Listing 4 Exemple 3: Dans le troisième cas l’utilisateur toto a un mot de passe comprenant des lettres et un chiffre : resiste1 John commence déjà à avoir du mal et met un peu plus de temps. Dans ce que nous venons de voir, on retiendra tout simplement qu’un bon mot de passe doit contenir des lettres, des chiffres et des caractères spéciaux et doit être d’une certaine longueur. Nous voyons aussi l’importance de protéger les HASH des mots de passe en limitant l’accès aux tables SYS.USER$ et DBA_USERS. Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit External password files Une des problématiques est souvent l’exécution des scripts, et comment se connecter à travers le script à la base sans fournir le login et le mot de passe en dur dans le script. Pendant longtemps on a utilisé l’authentification OS. Figure 3 Mais depuis la version 10g, nous avons la possibilité d’utiliser les wallets pour y stocker les infos de connexion Ce faisant, on peut ainsi se connecter à une base de données sans spécifier manuellement les infos de connexion, le mot de passe étant tout simplement puisé directement depuis le wallet où il est stocké en fonction de l’alias de connexion qui est spécifié. Figure 4 La mise en place d’une telle procédure se fait assez facilement. Création d’un auto login wallet Il faut d’abord créer un wallet qui va servir à stocker les informations de connexion. La commande utilisée est mkstore (Listing 5) $ mkstore -wrl "/u01/app/oracle/staff/wallet/" -create Oracle Secret Store Tool : Version 11.2.0.4.0 - Production Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. Enter password: Enter password again: [oracle@stand2 dbhome_1]$ Listing 5 Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit Le mot de passe du wallet sera requis pour maintenir le wallet, mais n’est pas nécessaire pour la connexion. Le wallet s’ouvrira automatiquement d’où le nom de auto-login wallet (le .sso) (Listing 6) [oracle@stand2 dbhome_1]$ ls -la /u01/app/oracle/staff/wallet/ total 8 drwxr-xr-x. 2 oracle oinstall 42 Apr 27 12:22 . drwxr-xr-x. 3 oracle oinstall 19 Apr 27 12:20 .. -rw-------. 1 oracle oinstall 3589 Apr 27 12:22 cwallet.sso -rw-------. 1 oracle oinstall 3512 Apr 27 12:22 ewallet.p12 [oracle@stand2 dbhome_1]$ Listing 6 Création d’une connexion sécurisée à travers le wallet Une fois le .sso créé, il faut lui associer les infos de connexion en lui donnant le login, le mot de passe et le TNS utilisé pour la connexion. Supposons que mon TNS_ALIAS soit de la forme (Listing 7) SOUGSEC_ALIAS = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = stand2.localdomain)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = SOUGSEC) ) ) Listing 7 Si on veut pouvoir utiliser l’utilisateur SYSTEM pour me connecter à la base sans spécifier le login et le mot de passe, il faut d’abord lui créer une entrée dans le wallet. Cela se fait toujours avec la commande mkstore (Listing 8). [oracle@stand2 wallet]$ mkstore -wrl "/u01/app/oracle/staff/wallet/ cwallet.sso ewallet.p12 [oracle@stand2 wallet]$ mkstore -wrl "/u01/app/oracle/staff/wallet/" createCredential SOUGSEC_ALIAS system root Oracle Secret Store Tool : Version 11.2.0.4.0 - Production Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. Enter wallet password: Create credential oracle.security.client.connect_string1 [oracle@stand2 wallet]$ Listing 8 Il faudra juste noter que l’approche précédente n’est pas conseillée, car le mot de passe est écrit en clair dans la commande, il faut plutôt juste passer en paramètre le login et le mot de passe nous sera demandé (Listing 9). Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit [oracle@stand2 wallet]$ mkstore -wrl "/u01/app/oracle/staff/wallet/" createCredential SOUGSEC_ALIAS_t toto Oracle Secret Store Tool : Version 11.2.0.4.0 - Production Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. Your secret/Password is missing in the command line Enter your secret/Password: Re-enter your secret/Password: Enter wallet password: Create credential oracle.security.client.connect_string2 [oracle@stand2 wallet]$ Listing 9 Nous pouvons vérifier les infos stockées dans notre wallet par l’option –listCredential (Listing 10) [oracle@stand2 wallet]$ mkstore -wrl "/u01/app/oracle/staff/wallet/" listCredential Oracle Secret Store Tool : Version 11.2.0.4.0 - Production Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. Enter wallet password: List credential (index: connect_string username) 2: SOUGSEC_ALIAS_t toto 10) Listing 10 Modifier le sqlnet.ora et redémarrer le listener La location du wallet doit être spécifiée dans le sqlnet.ora via le paramètre WALLET_LOCATION [oracle@stand2 admin]$ cat sqlnet.ora WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /u01/app/oracle/staff/wallet) ) ) SQLNET.WALLET_OVERRIDE = TRUE SSL_CLIENT_AUTHENTICATION = FALSE Listing 11 Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit Se connecter en utilisant l’Alias Nous pouvons maintenant nous connecter en utilisant tout simplement la forme /@SOUGSEC_ALIAS (Listing 12) [oracle@stand2 admin]$ sqlplus /@SOUGSEC_ALIAS SQL*Plus: Release 11.2.0.4.0 Production on Wed Apr 27 14:16:46 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> show user USER is "SYSTEM" SQL> Listing 12 Une chose importante : L’utilisation des external password files ne modifie en rien le mécanisme de connexion de la base. Les données d’authentification sont toujours envoyées en clair. Le wallet nous dispense tout simplement de suppléer un login et un mot de passe. D’où la nécessité de voir comment crypter les données. Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit Encryption des données en transit Par défaut les données envoyées dans un environnement oracle ne sont pas cryptées. Même les mots de passe sont envoyés en clair. Nous pouvons nous en rendre compte en faisant une capture du trafic dans notre réseau. Faisons une petite démonstration A partir du serveur prima1 nous établissons une connexion sur la base oracle qui est sur le serveur stand2. Et nous exécutons les deux commandes suivantes (Listing 13) SQL> host hostname prima1.localdomain SQL> alter user toto identified by toto1; User altered. SQL> select * from scott.emp; Listing 13 Regardons maintenant les captures de trafic que nous avons fait en utilisant tcpflow sur le serveur stand2 (Listing 14) [root@stand2 capture]# grep toto * Binary file 156.151.097.080.22573-156.151.097.082.01521 matches [root@stand2 capture]# strings 156.151.097.080.22573-156.151.097.082.01521 #alter user toto identified by toto1 select * from scott.emp [root@stand2 capture]# strings 156.151.097.082.01521-156.151.097.080.22573 EMPNO ENAME HIREDATE COMM DEPTNO SMITH CLERK ALLEN SALESMAN WARD Listing 14 On voit que toutes les données sont envoyées en clair, et même la modification mot de passe. Pour ce dernier, le DBA ne doit pas changer un mot de passe avec un alter user, à moins d’être sûr de l’encryption de son réseau, car les données sont envoyées en clair avec cette option. Il est rigoureusement conseillé d’utiliser la syntaxe password comme démontré ci-dessous, qui crypte les données. Toujours à partir du serveur prima1, changeons le mot de passe de toto avec la syntaxe password (Listing 15) SQL> password toto Changing password for toto New password: Retype new password: Password changed SQL> Listing 15 Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit En regardant de nouveau les données capturées on voit que les données envoyées sont cette fois ci cryptées, du moins pour la modification du mot de passe avec la syntaxe password (Listing 16) [root@stand2 capture]# strings 156.151.097.080.22818-156.151.097.082.01521 toto$ AUTH_SESSKEY AUTH_NEWPASSWORD @95A11E6628E3D9847ED93B83E5662E499422001EAC42EB6817544B767DB07273 AUTH_TERMINAL pts/3 AUTH_PROGRAM_NMr &[email protected] (TNS V1-V3) AUTH_MACHINE6 prima1.localdomain AUTH_PID 15207 AUTH_SID oracle AUTH_ALTER_SESSIONo %ALTER SESSION SET TIME_ZONE='+02:00' [root@stand2 capture]# Listing 16 Mais si le problème est résolu pour la modification des mots de passe, qu’en est-il des autres données. Eh bien il existe plusieurs méthodes pour encrypter ses données en transit (Mise en place de protocole TCPS, Utilisation des certificats, ..). Mais d’une manière générale ce qui dissuade la mise en place de ces méthodes est surtout la complexité et aussi la nécessité d’avoir l’option Oracle Advanced Security. En fait depuis la 10g on a cette fameuse phrase ici qui change tout https://docs.oracle.com/cd/B19306_01/license.102/b14199/options.htm#DBLIC137 Network encryption (native network encryption and SSL/TLS) and strong authentication services (Kerberos, PKI, and RADIUS) are no longer part of Oracle Advanced Security and are available in all licensed editions of all supported releases of the Oracle database. Cool mais reste le problème de la complexité, eh bien non. Car actuellement oracle permet d’encrypter le réseau très facilement avec juste quelques paramètres à ajouter dans le sqlnet.ora. Le ratio sécurité/performance reste largement acceptable. Petite démonstration : Reprenons nos exemples précédents mais en ayant au préalable ajouté les paramètres suivants dans nos fichier sqlnet.ora (côté serveur et client) (Listing 17) [oracle@prima1 admin]$ grep encryption sqlnet.ora sqlnet.encryption_server = accepted sqlnet.encryption_client = requested sqlnet.encryption_types_server =( rc4_256) sqlnet.encryption_types_client =( rc4_256) [oracle@prima1 admin]$ Listing 17 Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit A partir du serveur prima1, connectons-nous sur la base sur le serveur stand2 et exécutons les requêtes comme précédemment (Listing 18) [oracle@prima1 admin]$ sqlplus system@SOUGSEC_ALIAS SQL*Plus: Release 12.2.0.0.2 Beta on Wed Apr 27 17:12:05 2016 Copyright (c) 1982, 2015, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> alter user toto identified by toto1; User altered. SQL> select * from scott.emp; Listing 18 Et maintenant si nous regardons les captures de trafic, bingo, les données sont encryptées (Listing 19) [root@stand2 capture]# strings 156.151.097.082.01521-156.151.097.080.23495 |KEo _?!L ,C3Q< dGvW\Q foo bar baz bat quux yGw* x&_9 `<g 8 jB>0 vwX*&" 5B8M Z+mc fM%| >~6|N^\ @[jod^E … Listing 19 Pour cette partie nous retiendrons tout simplement que par défaut les données sont transmises en clair et que par contre oracle fournit actuellement des méthodes assez simples pour encrypter le trafic. Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit Conclusion Dans cet article, nous avons voulu mettre en évidence le fait que la sécurité de nos données peut se mettre en place avec des moyens simples ne nécessitant aucune option supplémentaire. Références: How to secure Oracle 10g and 11g by Ron B Natan CRC Press https://www.crcpress.com/HOWTO-Secure-and-Audit-Oracle-10g-and11g/BenNatan/9781420084122 Oracle official documentation Oracle-base.com Contact : Mouhamadou Diaw Senior Oracle Consultant [email protected] Mouhamadou Diaw, dbi services Eléments de sécurité sur les mots de passe et Cryptage des données en transit