J’ai eu la « chance » de configurer l’OMS et les agents d’Oracle GridControl 10.2.0.3 en HTTPS via port 443 le tout avec Linux et après quelques ébats : ça marche ! Rien d’exceptionnel ? Une revue (que je vais compléter !) de ces aspects de paramétrage vous indiqueront que :
- Les agents 11g (pour dans quelques mois j’espère) implémenteront très probablement l’Enhancement Request 5055990 intitulée « Need EM Agent to work on port 443 (securely) on Unix ». Et, pour le plaisir, Linux fonctionne comme Unix dans ce cas !
- Cette section de la documentation qui explique comment faire travailler agent et OMS à travers un firewall et mentionne en particulier « Before completing that step, configure your firewalls to allow both HTTP and HTTPS traffic between the Management Agent and Management Repository ». Bien sur entre 2 data center différents, c’est un peu délicat de demander ça… Sans attendre 3 mois
- Cette section de la documentation indique clairement qu’il faudra aussi créer un canal SQL*NET entre le Grid Control et les bases de données cibles pour les aspects d’administration. Ne rigolez pas 😉 !
Et pour dire vrai :
- Effectivement les agents Linux et Unix ne peuvent pas discuter sur le port 443 et il n’est pas possible de créer un proxy http dans ce sens ! MAIS ! Vous pouvez faire une translation de port sur l’OMS et sur le serveur de l’agent… Cette technique vous permet de vous sortir « simplement » de la restriction actuelle au moins si votre OMS est sous Linux. Le dialogue passe alors à travers le port 443 du serveur de l’agent, même si l’agent écoute sur une adresse au dessus de 1024
- Ma lecture de cette restrictions reside dans la procedure d’installation. Enfin si vous configurez les agents « à la main » avec « emctl deploy », il n’y a eu aucun trafic HTTP (de toute façon il était bloqué sur TOUS les ports !)
- Effectivement ! Il vous faudra sans doute, comme moi, créer un tunnel sécurisé SQL*NET grâce à un Connection Manager dans chaque data center ! Je vous conseille « Net Services Administrator’s Guide – Configuring and Administering Oracle Connection Manager » pour plus d’informations. Lorsque vous configurez la cible base de données, il est possible de préciser l’URL de connexion et donc d’utiliser un listener situé localement.
Note : Si le port par défaut du protocole HTTPS est 443, il est possible d’écouter en HTTPS sur n’importe quel port ! Il y a donc une différence fondamentale entre bloquer tous les ports sauf le port 443 et filtrer le protocole HTTPS. La première solution vous permet, par exemple, de dialoguer en HTTP sans SSL à travers le port 443. La deuxième solution vous permet de dialoguer via un autre port si le protocole est HTTPS. Dans ce qui est décrit ci-dessous (a) tous les ports sont bloqués sauf 443 et (b) le firewall filtre le protocole HTTPS. Bien sur s’agissant de l’OMS et des agents, les requêtes doivent être faites dans les 2 sens
Configurer l’OMS pour qu’il ne soit accessible qu’en HTTPS sur le port 443
Cette étape est finalement assez simple quoi qu’il faille naviguer entre les différentes documentations. Il faut :
1) Stopper l’OMS avec la commande ci dessous :
$ORACLE_HOME/opmn/bin/opmnctl stopall
2) Passez le fichier .apachectl root comme décrit dans cette section de la documentation « Oracle HTTP Server Administrator’s Guide ».
cd $ORACLE_HOME/Apache/Apache/bin
chown root .apachectl
chmod 6750 .apachectl
3) Changez le port sécurisé comme décrit sous « To change the default Management Service port to a secure port » dans le document « Enterprise Manager Advanced Configuration – 12.2 Reconfiguring the Oracle Management Service« . Pour cela exécutez les commandes suivantes :
$ORACLE_HOME/bin/emctl secure oms
-secure_port 443
ORACLE_HOME/dcm/bin/dcmctl updateconfig -ct ohs
4) Eventuellement bloquer l’OMS. Dans ce cas, vous ne pourrez plus communiquer autrement qu’en HTTPS. C’est vrai y compris, d’après mes tests, via l’interface web : seule la page d’accueil s’affiche dans votre navigateur web. Quand vous tentez de vous connecter, votre navigateur reçoit un message HTTP 302 et reste bloqué sur la même page.
$ORACLE_HOME/bin/emctl lock oms
5) Redémarrez l’OMS
$ORACLE_HOME/bin/emctl start oms
2 points à noter :
– Si vous avez déjà des agents configurés, il faudra changer la valeur de REPOSITORY_URL située dans le fichier $AGENT_HOME/sysman/config/emd.properties. Pour qu’elle pointe vers la nouvelle adresse de votre OMS. Vous trouverez plus d’informations dans « Enterprise Manager Advanced Configuration – 12.1 Reconfiguring the Oracle Management Agent« . Si vos agents ne communiquaient pas encore en HTTPS, reportez-vous à « Enterprise Manager Advanced Configuration – 5.2.4 Enabling Security for the Oracle Management Agent«
– Vous pouvez ajouter un certificat validé par un organisme externe, comme Entrust pour éviter le message de votre navigateur web et pour sécuriser votre environnement un peu plus. Pour information, la configuration SSL du serveur apache est stockée dans le fichier httpd_em.conf dans le répertoire $ORACLE_HOME/sysman/config.
Configurer vos serveurs OMS et cibles pour permettre le « Port Address Translation (NPAT) »
Le principe que nous allons utiliser est schématisé ci-dessous ; il consiste à effectuer 2 translation de ports avec iptables de manière que le trafic passe par 443 mais que ni l’OMS, ni l’agent ne sachent que le port n’est pas 3872 (ou celui de votre choix). Pour cela, il faut configurer iptables :
- sur l’OMS pour qu’il transforme les appels à target:3872 vers target:443
- sur la cible pour qu’elle transforme les appels vers target:443 vers des appels à target:3872
Pour réaliser cette opération, il faut :
1) Vérifier que les 2 adresses sont connues soit via les DNS, soit via les fichiers /etc/hosts des 2 machines. Dans le pire des cas, le protocole ICMP est aussi bloqué et vous ne pourrez pas tester avec ping ; toutefois le ping doit afficher la résolution de l’adresse en fonction du nom.
2) Vérifier que iptables est actif (là je deviens encore plus spécif
ique – ces procédures sont pour Redhat Linux 3+ ou Oracle Enterprise Linux 4+). Sous root :
# Pour quel niveau iptables démarre automatiquement ?
/sbin/chkconfig --list iptables
# Quel est le niveau au boot ?
grep initdefault /etc/inittab|grep ":"
# Active iptables lors du passage dans les niveaux 3 et 5
/sbin/chkconfig --level 35 iptables on
# iptables est-il actuellement actif ?
# (oui si affiche les tables)
/sbin/service iptables status
# demarre iptables
/sbin/service iptables start
3) Ajouter une règle qui fasse la translation des ports. Cette opération est bien sur différente sur le serveur OMS et sur la cible puisque la règle de translation est différente. On supposera que l’adresse IP de la cible est 10.0.0.1 ; Remarquez que comme dans l’établissement de la connexion vers la cible, jamais l’adresse de l’OMS apparaît elle n’apparaît pas dans les règles;
Sur l’OMS :
iptables -t nat -A OUTPUT
-d 10.0.0.1 -p tcp --dport 3872
-j DNAT --to-destination 10.0.0.1:443
Sur le serveur cible :
iptables -t nat -A PREROUTING
-d 10.0.0.1 -p tcp --dport 443
-j REDIRECT --to-ports 3872
Remarques :
– iptables sert généralement de firewall. S’il était déjà activé, il faudrait veiller à l’ordre des règles et en particulier que les trames concernées ne soient pas bloquées
– Pour éviter de se tromper,
- vous pouvez visualiser les règles avec « iptables -t nat -L ».
- vous pouvez supprimer une règle avec « iptables -t nat -D [chaîne] [numregle] » ou [chaîne] est selon ce que vous avez modifié PREROUTING ou OUTPUT et [numregle] est la position de la règle dans votre chaîne (e.g. 1 si votre table était vide avant)
- vous pouvez sauvegardez toutes les règles dans un fichier avec « iptables-save >monfichier »
- vous pouvez restaurer toutes les règles à partir d’un fichier avec « iptable-restore <monfichier »
4) Sauvegarder l’ensemble des règles dans la configuration iptables utilisé par le service
/etc/init.d/iptables save
Configurer les agents manuellement.
Pendant l’installation des agents (avec runInstaller), vous pouvez avoir plusieurs erreurs :
1) Dans l’écran « Specify Agent Management Service Location » positionnez le nom du serveur OMS ainsi que 443 comme port de communication ; comme le test n’est pas effectué en HTTPS, vous aurez forcément un message d’erreur « The specified Management Service on host x at port y is unreachable […] » Cliquer sur OK pour continuer malgré tout !
2) L’assistant de configuration des agents doit laisser au minimum les agents non-sécurisé. Vous trouverez ci-dessous l’ensemble de étapes pour remettre la configuration à plat.
2.a) Dans le cas ou la configuration n’est pas correcte vous pouvez la refaire complètement… En fait dans mon cas (RAC), cette configuration est visiblement faite sur le premier nœud avec les informations des nœuds du cluster dont l' »Installer » dispose via le clusterware puis est poussée sur les autres noeuds. Lorsque les agents démarrent, ils vont chercher leur configuration dans le répertoire `hostname` de l’ORACLE_HOME de l’agent :
- Si, par le jeu des noms de domaine par exemple, la configuration est différente du hostname sur le serveur, vous serez amener à refaire la configuration comme ce qui suit.
- D’autre part, refaire la configuration permet de maîtriser la manière dont l’agent est représenté dans l’OMS (i.e. avec le nom de domaine ou nom), il permet de changer un nom de la cible
- Enfin, si vous avez un nom de domaine trop long, il est possible que l’agent ne stocke pas sa configuration comme il faut dans l’OMS. Cette méthode permet de s’en abstraire
Pour refaire la configuration, il faut utiliser la commande « emctl deploy ». Voici comment :
#Remplacez ce qui suit par votre ORACLE_HOME
export ORACLE_HOME=/u01/app/oracle/product/10.2.0/agent10g
export PATH=$ORACLE_HOME/bin:$PATH
cd $ORACLE_HOME
# Effacer le répertoire qui suit revient à effacer la configuration
# de l'agent. Vérifiez qu'il n'a a pas un autre répertoire avec un
# nom de serveur et supprimez-le manuellement
rm -rf $ORACLE_HOME/`hostname`
# Utiliser emctl deploy pour créer la configuration
export MYHOSTNAME=$lt;nom_agent_dans_oms>
emctl deploy agent
$ORACLE_HOME/`hostname`
$MYHOSTNAME:3872
`hostname`
# truc
# -----
# Il est possible de changer les chaînes `hostname` pour changer
# la manière dont le serveur apparaît dans le GridControl toutefois
# le répertoire doit correspondre avec $ORACLE_HOME/`hostname`.
# Si pour n'importe quel raison ce n'est pas le cas, un lien permet
# à l'agent de s'y retrouver
# -----
# cd $ORACLE_HOME
# ln -s `hostname` $MYHOSTNAME
2.b) Une fois que la configuration est faite, il faut la modifier pour qu’elle supporte HTTPS et sécuriser l’agent. Pour cela opérez ce qui suit :
- Editez le fichier emd.properties de votre configuration comme dans l’exemple qui suit :
export ORACLE_HOME=/u01/app/oracle/product/10.2.0/agent10g
export PATH=$ORACLE_HOME/bin:$PATH
cd $ORACLE_HOME/`hostname`/sysman/config
vi emd.properties
- Modifiez les URLs suivantes :
- REPOSITORY_URL ressemble à ce qui suit : http://mon-oms:443/em/upload/ . Modifiez cette URL de façon à remplacer http par https et supprimer le / à la fin (important en https, le / à la fin de l’URL NE DOIT PAS être présent) . Votre propriété doit ressembler à ceci :
REPOSITORY_URL=https://mon-oms:443/em/upload - emdWalletSrcUrl ressemble à ce qui suit : http://mon-oms:443/em/wallets/emd . Modifiez cette URL de façon à remplacer http par https. Votre propriété doit ressembler à ceci :
emdWalletSrcUrl=https://mon-oms:443/em/wallets/emd - EMD_URL ressemble à ce qui suit : https://target:3872/emd/main . Modifiez cette URL de façon à remplacer http par https. Votre propriété doit ressembler à ceci :
EMD_URL=https://target:3872/emd/main (Si vous voulez modifiez le port d’écoute de l’agent pour n’importe quelle valeur libre et >= 1024, il suffit de changer la valeur de ce port.
- Vous pouvez ensuite simplement, sécuriser l’agent, le démarrer et chargez les fichiers dans l’OMS :
emctl secure agent
emctl start agent
emctl upload
Remarques :
a- runConfig.sh est l’assistant de configuration de l’agent qui est lancé à la fin de l’installation. S’il échoue, son fichier de log est situé dans cfgtoollogs/cfgfw
b- pour tester vos connexions https, utilisez wget avec, par exemple comme ceci « wget –no-check-certificate https://oms-host:443 »
c- Si vous utilisez les scripts agentDownload, ce que je recommande, même si, avec RAC, ce n’est encore très clair pour moi, je pense que c’est plus simple. Enfin j’espère et je compte sur vous pour me donner votre feedback
Voilà qui conclut cette expérience avec une configuration un peu spéciale. Mon contact Oracle sur ce sujet a dit : « Obviously you watched all the MycGyver episodes 😉 ». En fait c’est Rus
ty Russel qu’il faut remercier ! Quant à moi, je souhaite que cette expérience pour sécuriser le GridControl et/ou que cet exemple d’utilisation de NPAT vous soit utile.