Remarque :

Utiliser SELinux sur Oracle Linux

Introduction

SELinux est un ensemble de modules de noyau et d'outils d'espace utilisateur qui fournissent une autre couche de sécurité du système, un contrôle d'accès précis, des stratégies définies par l'administrateur à l'échelle du système et une meilleure atténuation des attaques d'escalade de privilèges.

Ce tutoriel vous guide tout au long de l'utilisation de ces outils d'espace utilisateur pour vous aider à maintenir votre système en mode d'application.

Objectifs

Dans cet exercice, vous allez apprendre à :

Prérequis

Environnement des exercices de configuration

Remarque : lorsque vous utilisez l'environnement d'atelier gratuit, reportez-vous à Oracle Linux Lab Basics pour obtenir des instructions de connexion et d'utilisation.

Création d'un utilisateur

Un utilisateur supplémentaire permet de tester l'affectation d'un utilisateur SELinux ultérieurement dans cet exercice.

  1. S'il n'est pas déjà connecté, ouvrez un terminal et connectez-vous via SSH au système ol8-server.

    ssh oracle@<ip_address_of_ol8-server>
    
  2. Créez un utilisateur et définissez un mot de passe.

    sudo useradd -u 8000 ralph
    echo "ralph:oracle" | sudo chpasswd
    
  3. Autorisez les connexions SSH.

    Copiez la clé SSH à partir du compte utilisateur oracle.

    sudo mkdir /home/ralph/.ssh
    sudo cp /home/oracle/.ssh/authorized_keys /home/ralph/.ssh/authorized_keys
    sudo chown -R ralph:ralph /home/ralph/.ssh
    sudo chmod 700 /home/ralph/.ssh
    sudo chmod 600 /home/ralph/.ssh/authorized_keys
    
  4. Ouvrez un nouveau terminal et vérifiez que la connexion SSH fonctionne.

    ssh ralph@<ip_address_of_ol8-server>
    

    Ensuite, exit la session et fermez la fenêtre de terminal.

Mode et statut SELinux

Oracle Linux installe SELinux par défaut et s'exécute en mode Enforcing.

  1. Vérifiez le mode SELinux.

    Elle doit être définie sur Enforcing.

    getenforce
    
  2. Vérifiez les états et modes SELinux.

    sestatus
    

    La sortie de la commande sestatus indique le statut, la stratégie et le mode de SELinux.

    Exemple de sortie :

    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             targeted
    Current mode:                   enforcing
    Mode from config file:          enforcing
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Memory protection checking:     actual (secure)
    Max kernel policy version:      31
    

Libellés de sécurité SELinux

Chaque processus et ressource système sous SELinux possède un libellé de sécurité appelé contexte SELinux. Le contexte SELinux, également appelé libellé SELinux, se concentre sur les propriétés de sécurité et garantit un moyen cohérent de référencer des objets dans la stratégie SELinux.

  1. Afficher le libellé de sécurité SELinux pour un fichier.

    ls -ldZ /etc/passwd
    

    Exemple de sortie :

    -rw-r--r--. 1 root root system_u:object_r:passwd_file_t:s0 1892 Apr 13 14:39 /etc/passwd
    

    La sortie ls avec l'option -Z affiche les quatre champs d'attribut SELinux :

    • utilisateur : system_u
    • rôle : object_r
    • type : passwd_file_t
    • sécurité : s0

    Le plus important est le type SELinux, car la majorité des règles de stratégie SELinux targeted utilisent des types SELinux pour définir l'interaction autorisée entre un objet (par exemple, processus) et un autre (par exemple, fichier).

  2. Obtenir la liste des types de SELinux disponibles.

    seinfo --type | head
    
    • La commande head limite la sortie aux dix premières lignes de sortie uniquement.

    La sortie complète indique que des types SELinux existent pour plusieurs commandes et services différents, tels que ssh et sshd.

  3. Obtenir la liste des types spécifiques de SELinux.

    grep limite la sortie aux types contenant le mot ssh uniquement.

    seinfo -t | grep ssh
    
  4. Obtenir la liste des laboratoires de sécurité pour des processus et des fichiers de configuration spécifiques.

    ps obtient les libellés de sécurité des processus.

    ps -efZ | grep sshd
    

    Exemple de sortie :

    system_u:system_r:sshd_t:s0-s0:c0.c1023 root 2535      1  0 14:37 ?        00:00:00 /usr/sbin/sshd -D
    system_u:system_r:sshd_t:s0-s0:c0.c1023 root 18514  2535  0 15:21 ?        00:00:00 sshd: oracle [priv]
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 18528 18514  0 15:21 ? 00:00:00 sshd: oracle@pts/0
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 23611 18529  0 15:41 pts/0 00:00:00 grep --color=auto sshd
    

    ls obtient les étiquettes de sécurité des fichiers de configuration.

    ls -lZ /etc/ssh/
    

    Exemple de sortie :

    total 600
    -rw-r--r--. 1 root root     system_u:object_r:etc_t:s0      577388 Oct  9  2021 moduli
    -rw-r--r--. 1 root root     system_u:object_r:etc_t:s0        1770 Oct  9  2021 ssh_config
    drwxr-xr-x. 2 root root     system_u:object_r:etc_t:s0          28 Feb 18 08:51 ssh_config.d
    -rw-------. 1 root root     system_u:object_r:etc_t:s0        4268 Apr 13 14:37 sshd_config
    -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0    537 Apr 13 14:37 ssh_host_ecdsa_key
    -rw-r--r--. 1 root root     system_u:object_r:sshd_key_t:s0    197 Apr 13 14:37 ssh_host_ecdsa_key.pub
    -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0    432 Apr 13 14:37 ssh_host_ed25519_key
    -rw-r--r--. 1 root root     system_u:object_r:sshd_key_t:s0    117 Apr 13 14:37 ssh_host_ed25519_key.pub
    -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0   2635 Apr 13 14:37 ssh_host_rsa_key
    -rw-r--r--. 1 root root     system_u:object_r:sshd_key_t:s0    589 Apr 13 14:37 ssh_host_rsa_key.pub
    

    Le processus démon sshd utilise le type sshd_t. Par conséquent, dans la stratégie targeted, une règle pour l'attribut SELinux sshd_t indique que les objets avec sshd_t peuvent accéder à tous les objets avec l'attribut de sécurité suivant :

    • etc_t
    • sshd_key_t
    • ...

    De même, pour examiner la commande ssh, nous pourrions déterminer un mappage similaire entre ssh_home_t et ssh_exec_t.

    ls -lZ /usr/bin/ssh
    

    Exemple de sortie :

    -rwxr-xr-x. 1 root root system_u:object_r:ssh_exec_t:s0 775720 Oct  9  2021 /usr/bin/ssh
    
    ls -lZ ~/.ssh
    

    Exemple de sortie :

    total 4
    -rw-------. 1 oracle oracle unconfined_u:object_r:ssh_home_t:s0 404 Apr 13 14:39 authorized_keys
    
  5. Obtenir le contexte de sécurité d'un utilisateur.

    L'autre type de contexte qui vous intéresse est unconfined_t. Les objets de ce type SELinux, tels que les utilisateurs, disposent d'un accès illimité. Ce niveau d'accès signifie que SELinux ne limite pas ce que les utilisateurs peuvent faire et les empêche uniquement par le biais des autorisations DAC. DAC (Discretionary Access Control) est la stratégie de sécurité gérée par les utilisateurs traditionnels, les groupes et d'autres autorisations.

    Par exemple, affichez les attributs de sécurité de l'utilisateur oracle.

    whoami
    
    id -Z
    

    Exemple de sortie :

    [oracle@ol-selinux ~]$ whoami
    oracle
    [oracle@ol-selinux ~]$ id -Z
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    

Services réseau et SELinux

SELinux effectue le suivi des configurations des packages logiciels réseau les plus couramment utilisés dans sa base de données interne. Ce suivi permet à SELinux de protéger le système des services externes exposés à des attaques.

Par conséquent, SELinux peut empêcher un service de fonctionner si vous configurez le logiciel pour utiliser un répertoire ou un port non standard.

Pour montrer ce que SELinux sait des ports standard d'un système, nous devons utiliser l'utilitaire SELinux semanage. Oracle Linux n'installe pas l'utilitaire par défaut. Installez-le donc.

  1. Déterminez quel package fournit l'utilitaire.

    sudo dnf whatprovides semanage
    

    Les résultats indiquent que /usr/sbin/semanage fait partie du package policycoreutils-python-utils.

  2. Installez le package et toutes les dépendances.

    sudo dnf install -y policycoreutils-python-utils
    
  3. Vérifiez les ports autorisés par SELinux pour sshd.

    sudo semanage port -l | grep ssh
    

    Exemple de sortie :

    ssh_port_t                     tcp      22
    
  4. Ajoutez un port à la stratégie SELinux.

    Si nous devions modifier le port sur lequel le démon SSH écoute la valeur 2222 ou modifier l'emplacement de stockage de la configuration par défaut, nous devrions informer SELinux que nous voulons ces modifications. Nous pouvons à nouveau utiliser semanage pour autoriser un port personnalisé en ajoutant une nouvelle règle de stratégie.

    sudo sudo semanage port -a -t ssh_port_t -p tcp 2222
    
    • L'option -a ajoute une nouvelle règle de stratégie de type -t.
  5. Vérifiez les ports autorisés par SELinux.

    sudo semanage port -l | grep ssh
    

    Exemple de sortie :

    ssh_port_t                     tcp      2222, 22
    
  6. Modifiez un port dans la stratégie SELinux.

    Supposons que nous voulions mapper le démon SSH au port 443. Répétez la même commande, mais une erreur survient avec un message indiquant que le port est déjà utilisé.

    sudo semanage port -a -t ssh_port_t -p tcp 443
    

    Exemple de sortie :

    ValueError: Port tcp/443 already defined
    

    L'erreur est survenue car nous essayons de faire passer le port 443 du type http_port_t au type ssh_port_t. Pour que cela fonctionne, utilisez l'option -m, qui modifie l'enregistrement d'objet de port.

    sudo semanage port -m -t ssh_port_t -p tcp 443
    

Utilisateurs SELinux

Chaque utilisateur Linux est mis en correspondance avec un utilisateur SELinux à l'aide d'une stratégie SELinux. Cette approche permet aux utilisateurs Linux d'hériter des restrictions en fonction de leur mappage utilisateur SELinux. Le mappage par défaut dans Oracle Linux est la connexion __default__, qui est mise en correspondance avec l'utilisateur SELinux unconfined_u.

  1. Obtenir la liste de tous les mappages utilisateur Linux en cours.

    sudo semanage login -l
    
    • Notez que notre utilisateur oracle n'est pas répertorié et est donc mappé avec l'utilisateur unconfined_u.
  2. Obtenir la liste des utilisateurs de SELinux.

    seinfo -u
    
  3. Limitez les actions d'un utilisateur.

    Bien qu'un utilisateur Linux par défaut s'exécute sans contrainte, les actions de l'utilisateur peuvent induire des restrictions basées sur les applications domain. domain est un groupe d'objets de même type SELinux.

    Et si nous voulions empêcher les utilisateurs d'utiliser le système X Window, sudo et le réseau ?

    Pour cela, SELinux a un utilisateur.

    Pour ce faire, nous devons disposer d'un autre utilisateur Linux. Nous utiliserons l'utilisateur ralph.

    1. Créez le mapping vers guest_u.

      sudo semanage login -a -s guest_u ralph
      
    2. Vérifiez le mappage.

      sudo semanage login -l
      
    3. Vérifiez que ralph ne peut pas accéder au réseau.

      Les restrictions héritées de guest_u ne se produisent qu'après la connexion et non en exécutant sudo ou su.

      Ouvrez un nouveau terminal et connectez-vous via ssh au système ol8-server en tant qu'utilisateur ralph.

      ssh ralph@<ip_address_of_ol8-server>
      
    4. Vérifiez le contexte de l'utilisateur.

      id; id -Z
      

      Exemple de sortie :

      uid=8000(ralph) gid=8000(ralph) groups=8000(ralph) context=guest_u:guest_r:guest_t:s0
      guest_u:guest_r:guest_t:s0
      
    5. Afficher le contexte de sécurité des processus en cours de l'utilisateur :

      ps axZ
      

      La sortie affiche l'utilisateur ralph mappé à guest_u et peut se connecter. Cependant, ralph ne doit pas être en mesure d'accéder au réseau.

    6. Testez la connectivité réseau avec ping.

      ping localhost
      

      Exemple de sortie :

      ping: socket: Permission denied
      
    7. Testez également le réseau à l'aide de curl.

      curl ifconfig.me
      

      Exemple de sortie :

      curl: (6) Could not resolve host: ifconfig.me
      

      Le message indique que curl ne peut pas résoudre le nom DNS de ifconfig.me en une adresse IP. Le DNS, un service réseau Linux, nécessite l'ouverture d'un socket, de sorte que l'utilisateur SELinux guest_u le bloque.

    8. Ferme la fenêtre de terminal actuelle.

      Nous avons terminé le test avec l'utilisateur ralph, fermez donc cette fenêtre de terminal.

      exit
      

Booléens de SELinux

Les valeurs booléennes de SELinux autorisent des modifications de stratégie spécifiques lors de l'exécution sans savoir comment écrire des stratégies SELinux. Oracle Linux fournit de nombreux booléens intégrés ou les administrateurs familiers avec les stratégies SELinux peuvent écrire les siennes. Les administrateurs sont encouragés à écrire des stratégies en tant que valeurs booléennes si la stratégie implémentée est facultative.

  1. Obtenez une liste de booléans avec leur signification.

    Revenez au terminal sur lequel vous êtes connecté en tant qu'utilisateur oracle et exécutez la commande suivante.

    sudo semanage boolean -l
    

    Exemple de sortie :

    SELinux boolean                State  Default Description
    
    abrt_anon_write                (off  ,  off)  Allow abrt to anon write
    abrt_handle_event              (off  ,  off)  Allow abrt to handle event
    abrt_upload_watch_anon_write   (on   ,   on)  Allow abrt to upload watch anon write
    antivirus_can_scan_system      (off  ,  off)  Allow antivirus to can scan system
    antivirus_use_jit              (off  ,  off)  Allow antivirus to use jit
    auditadm_exec_content          (on   ,   on)  Allow auditadm to exec content
    authlogin_nsswitch_use_ldap    (off  ,  off)  Allow authlogin to nsswitch use ldap
    authlogin_radius               (off  ,  off)  Allow authlogin to radius
    ...
    
    • La sortie explique le rôle de chaque booléen et indique s'il est activé (on) ou désactivé (off).
  2. Obtenez une liste des seuls booléens et leur statut.

    sudo getsebool -a
    

    Exemple de sortie :

    abrt_anon_write --> off
    abrt_handle_event --> off
    abrt_upload_watch_anon_write --> on
    antivirus_can_scan_system --> off
    antivirus_use_jit --> off
    auditadm_exec_content --> on
    authlogin_nsswitch_use_ldap --> off
    authlogin_radius --> off
    authlogin_yubikey --> off
    ...
    
  3. Obtenir le statut d'un seul booléen.

    Si le nom booléen est connu, transmettez le nom en tant qu'argument pour obtenir uniquement le statut des booléens.

    sudo getsebool virt_use_nfs
    
  4. Interrogez la stratégie SELinux pour une valeur booléenne.

    Vous êtes-vous déjà demandé quels déclencheurs booléens de la stratégie SELinux ? SELinux fournit un utilitaire permettant d'interroger ces règles.

    sesearch -b virt_use_nfs -A
    

    Exemple de sortie :

    allow fsdaemon_t autofs_t:dir { getattr open search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:file { getattr ioctl lock open read }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:lnk_file { getattr read }; [ virt_use_nfs ]:True
    ...
    
  5. Interroger si un booléen autorise l'accès.

    Et si un accès particulier est autorisé en fonction d'une valeur booléenne conditionnelle ? Répondez à la question : la commande ping utilisateur autorise-t-elle la transition d'un domaine utilisateur (user_t) vers le domaine ping (ping_t) ?

    sesearch -s user_t -t ping_t -c process -p transition -AT
    

    Exemple de sortie :

    allow user_t ping_t:process transition; [ selinuxuser_ping ]:True
    
    • La transition est autorisée si le booléen SELinux user_ping est activé.
  6. Activez une valeur booléenne.

    Supposons que nous souhaitons autoriser KVM à stocker des images sur un partage Samba ? Il y a aussi un booléen.

    1. Recherchez le booléen.

      sudo semanage boolean -l | grep virt | grep samba
      

      Exemple de sortie :

      virt_use_samba                 (off  ,  off)  Allow virt to use samba
      
    2. Remplacez la valeur boolean par Enabled.

      sudo setsebool virt_use_samba on
      

      ou

      sudo semanage boolean -m --on virt_use_samba
      
    3. Vérifiez le statut actuel.

      getsebool virt_use_samba
      
    4. Assurez-vous que la modification survit à une réinitialisation.

      sudo setsebool -P virt_use_samba on
      
  7. Afficher les personnalisations de stratégie SELinux locales.

    Sachant que nous avons modifié les paramètres par défaut, nous pouvons afficher ces personnalisations locales.

    sudo semanage boolean -l -C
    

    Exemple de sortie :

    SELinux boolean                State  Default Description
    
    virt_use_samba                 (on   ,   on)  Allow virt to use samba
    
    • La sortie indique que la valeur par défaut est désormais on. La valeur par défaut a été modifiée après la définition du commutateur comme permanent et l'écriture des valeurs en attente dans le fichier de stratégie sur le disque.

Contexte du fichier SELinux

Tous les fichiers et répertoires sont étiquetés avec un contexte SELinux lors de l'exécution de SELinux. Nous examinerons quelques commandes permettant de gérer l'étiquetage du système de fichiers.

Un exemple familier est la création d'un répertoire pour la racine de document de Nginx.

  1. Créez le nouveau répertoire avec trois fichiers.

    sudo mkdir -p /web
    sudo touch /web/file{1,2,3}
    
  2. Vérifiez le nouveau répertoire et l'étiquetage des fichiers.

    ls -lZ /web
    

    Exemple de sortie :

    total 0
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
    
    • Le type de contexte du nouveau répertoire et les fichiers sont default_t.

    Remarque : les fichiers et répertoires nouvellement créés héritent du type SELinux de leurs répertoires parent.

  3. Apportez des modifications temporaires aux libellés.

    Dans le cadre du dépannage ou du test, nous pouvons modifier temporairement le contexte.

    sudo chcon -R -t httpd_sys_content_t /web/
    
    ls -lZ /web
    
  4. Renvoyez les étiquettes aux paramètres par défaut.

    Rétablissez le type de contexte par défaut.

    sudo restorecon -R -v /web/
    

    Exemple de sortie :

    [oracle@ol-selinux ~]$ sudo restorecon -R -v /web/
    Relabeled /web from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
    Relabeled /web/file1 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
    Relabeled /web/file2 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
    Relabeled /web/file3 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
    [oracle@ol-selinux ~]$ ls -lZ /web
    total 0
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
    
  5. Les changements d'étiquette deviennent permanents.

    Pour rendre les modifications permanentes et survivre à une réinitialisation, utilisez la commande semanage fcontext. -a ajoute un enregistrement au fichier /etc/selinux/targeted/contexts/files/file_contexts.local et -t définit le type.

    sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
    

    Remarque : lors de la modification du contexte SELinux à l'aide de semanage fcontext, il est recommandé d'utiliser le chemin d'accès complet au fichier ou au répertoire pour éviter les erreurs d'étiquetage des fichiers après la modification de l'étiquette d'un système de fichiers ou après l'exécution de restorecon.

  6. Vérifiez le contexte.

    ls -ldZ /web; ls -lZ /web
    

    Exemple de sortie :

    [oracle@ol-selinux ~]$ ls -ldZ /web; ls -lZ /web
    drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 45 Apr 14 19:00 /web
    total 0
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
    

    Notez que le contexte n'a pas changé, ce que nous attendions.

  7. Affichez le contexte des fichiers et répertoires nouvellement créés.

    sudo semanage fcontext -C -l
    

    Exemple de sortie :

    [oracle@ol-selinux ~]$ sudo semanage fcontext -C -l
    SELinux fcontext                                   type               Context
    
    /web(/.*)?                                         all files          system_u:object_r:httpd_sys_content_t:s0 
    
  8. Appliquez les modifications au contexte.

    sudo restorecon -R -v /web
    

    Exemple de sortie :

    [oracle@ol-selinux ~]$ sudo restorecon -R -v /web
    Relabeled /web from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
    Relabeled /web/file1 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
    Relabeled /web/file2 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
    Relabeled /web/file3 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
    
  9. Supprimez le nouveau contexte SELinux.

    sudo semanage fcontext -d "/web(/.*)?"
    
    • Cet exemple transmet l'expression régulière utilisée lors de la création du contexte et la place au début de l'enregistrement de contexte dans le fichier. Etant donné qu'il s'agit d'une expression régulière, placez-la entre guillemets.
  10. Appliquez les modifications et vérifiez le contexte renvoyé à default_t.

    sudo restorecon -R -v /web; ls -ldZ /web; ls -lZ /web
    

Consultez les pages man des utilitaires indiqués. Utilisez ensuite ce que vous avez appris pour conserver SELinux en mode Enforcing.

Pour plus d'informations

Voir d'autres ressources connexes :

Ressources de formation supplémentaires

Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenu de formation gratuit sur le canal Oracle Learning YouTube. En outre, accédez à education.oracle.com/learning-explorer pour devenir explorateur Oracle Learning.

Pour consulter la documentation du produit, consultez Oracle Help Center.