13.3 Posit Connect et learnr

Vous pouvez distribuer des tutoriels learnr via Posit Connect. C’erst bien pratique, car vos utilisateurs n’oint pas besoin d’avoir R installé localement pour exécuter ces learnrs. Cependant, il faut garder à l’esprit que cela introduit une brèche de sécurité énorme dans votre serveur. En effet, le tutoriel learnr permet l’exécution de n’importe quel code R sur le serveur. Vous devez donc cloisonner et sécuriser suffisamment le processus R qui est utilisé pour éviter à l’utilisateur d’accéder à des données ou des composants sensibles sur votre serveur. Voic comment faire :

  • Installer AppArmor :
sudo apt-get install -y libapparmor-dev apparmor-utils
sudo R
install.packages("RAppArmor")
  • Configurer le profil AppArmor :
#cd /usr/local/lib/R/site-library/RAppArmor/
cd /opt/R/4.0.5/lib/R/library/RAppArmor/
sudo cp -Rf profiles/debian/* /etc/apparmor.d/

# Verify the profile
sudo nano /etc/apparmor.d/rapparmor.d/r-user
# Make sure there is /usr/lib/rstudio/bin/pandoc/* rix,

#Load the profiles into the kernel
sudo service apparmor restart

#To disable enforcing the global R profile
sudo aa-disable usr.bin.r

#To start enforcing the standard R policy:
sudo aa-enforce usr.bin.r

# Set options for learnr tutorials
sudo nano /opt/R/4.0.5/lib/R/etc/Rprofile.site
  • Ajouter ceci à la configuration du process R lancé par les learnrs :
options(tutorial.exercise.evaluator.onstart = function(pid) {
  # Import RAppArmor
  require(RAppArmor, quietly = TRUE)
  # Set process group to pid (allows kill of entire subtree in cleanup)
  setpgid();
  # Set nice priority
  setpriority(10)
  # Set rlimits as appropriate
  rlimit_nproc(1000)
  rlimit_as(100*1024*1024)
  # Change to r-user profile
  aa_change_profile("r-user")
})

options(tutorial.exercise.evaluator.oncleanup = function(pid) {
  # Import RAppArmor
  require(RAppArmor, quietly = TRUE)
  # Kill entire process subtree. note that the second call works
  # because the call to setpgid above sets our pgid (process group id)
  # to our pid (process id)
  kill(pid, tools::SIGKILL)
  kill(-1 * pid, tools::SIGKILL)
})
  • Le fichier r-user profile contient :
## Do not modify this file. Changes may be undone during upgrades. 
## To play around, create a copy with a different profile name and
## put it in: /etc/apparmor.d/rapparmor.d/

profile r-user {
        #include <abstractions/base>
        #include <abstractions/nameservice>

        capability kill,
        capability setgid,
        capability net_bind_service,
        capability sys_tty_config,

        @{HOME}/ r,
        @{HOME}/.Rprofile r,
        @{HOME}/R/ r,
        @{HOME}/R/** rw,
        @{HOME}/R/{i686,x86_64}-pc-linux-gnu-library/** mrwix,

        @{PROC}/[0-9]*/attr/current r,

        /bin/* rix,
        /dev/tty r,
        /etc/R/ r,
        /etc/R/* r,
        /etc/fonts/** mr,
        /etc/resolv.conf r,
        /etc/xml/* r,
        /tmp/** mrwix,
        /usr/bin/* rix,
        /usr/include/** r,
        /usr/lib/gcc/** rix,
        /usr/lib/R/bin/* rix,
        /usr/lib{,32,64}/** mr,
        /usr/lib{,32,64}/R/bin/exec/R rix,
        /usr/local/lib/R/** mr,
        /usr/local/lib/R/site-library/** mrwix,
        /usr/local/share/** mr,
        /usr/share/** mr,
        /usr/share/ca-certificates/** r,
        /opt/rstudio-connect/ext/pandoc/** mrix,
        /opt/rstudio-connect/ext/pandoc/2.9/* mrix,
        /opt/rstudio-connect/ext/pandoc/2.11/* mrix,
        /opt/rstudio-connect/** mrwix,
        /opt/R/4.0.5/lib/R/** mr,
        /opt/R/4.0.5/lib/R/library/** mrwix,
        /opt/rstudio-connect/mnt/** mrwix,
        /opt/rstudio-connect/mnt/app/packrat/lib/x86_64-pc-linux-gnu/4.0.5/** mrwix,
}
  • Redémarrer AppArmor avec le profil modifié :
sudo nano /etc/apparamor.d/rapparmor.d/r-user
sudo service apparmor restart
Testez toujours vos tutoriels learnrs sur le serveur et tentez d’exécuter des commandes potentiellement problématiques comme accéder à des dossiers ou fichiers sensibles, ou exécuter des commandes système avec system(...) dans un exercice où il faut rentrer du code R. Ne mettez vos tutoriels learnr en production que si vous êtes certain•e d’avoir correctement sécurisé votre serveur à ce niveau !

Sur les ordinateurs où vous développez vos learnrs, vous devez aussi installer les packages R suivants : install.packages(c("RAppArmor", "unix"))