Autorisations de fichier correctes pour WordPress [fermé]


399

J'ai jeté un œil ici mais je n'ai trouvé aucun détail sur les meilleures autorisations de fichiers. J'ai également jeté un coup d'œil à certaines des questions du formulaire WordPress ici, mais quiconque suggère que 777 a évidemment besoin d'une petite leçon de sécurité.

En bref, ma question est la suivante. Quelles autorisations dois-je avoir pour les éléments suivants:

  1. dossier racine stockant tout le contenu WordPress
  2. wp-admin
  3. contenu wp
  4. wp-comprend

puis tous les fichiers dans chacun de ces dossiers?


Fondamentalement, seul le dossier de téléchargement de Wordpress devrait être 777, mais ce serait une grave menace pour la sécurité. Si vous utilisez un serveur avec Suphp activé, il n'est pas nécessaire de modifier les autorisations, manuellement.
Ali F

4
Je vote pour fermer cette question comme hors sujet car elle est hors sujet selon l'extrait wiki du tag: "Les questions hors sujet incluent celles sur le développement de thème, l'administration WordPress, les meilleures pratiques de gestion, la configuration du serveur, etc."
Adriaan

Réponses:


499

Lorsque vous configurez WP, vous (le serveur Web) devrez peut-être accéder en écriture aux fichiers. Les droits d'accès peuvent donc devoir être lâches.

chown www-data:www-data  -R * # Let Apache be owner
find . -type d -exec chmod 755 {} \;  # Change directory permissions rwxr-xr-x
find . -type f -exec chmod 644 {} \;  # Change file permissions rw-r--r--

Après l'installation , vous devez serrer les droits d'accès , selon Durcissement WordPress tous les fichiers sauf pour wp-content doivent être inscriptibles par votre compte utilisateur uniquement. Le contenu wp doit également être accessible en écriture par www-data .

chown <username>:<username>  -R * # Let your useraccount be owner
chown www-data:www-data wp-content # Let apache be owner of wp-content

Vous voudrez peut-être changer le contenu de wp-content plus tard. Dans ce cas, vous pourriez

  • passer temporairement à l'utilisateur pour www-data avec su,
  • donner au groupe wp-content un accès en écriture 775 et rejoindre le groupe www-data ou
  • donnez à votre utilisateur les droits d'accès au dossier à l'aide des ACL .

Quoi que vous fassiez, assurez-vous que les fichiers disposent des autorisations rw pour www-data .


2
Kornel donne un de ces liens faisant autorité ci-dessous. Voir aussi codex.wordpress.org/Changing_File_Permissions , le document Apache httpd.apache.org/docs/2.2/misc/security_tips.html , et à peu près n'importe quelle recherche google sur le sujet. Mais dans le cas général, en cas de doute, ne donnez aucun accès en écriture (et certainement pas de propriété) et relâchez au cas par cas, pas l'inverse (principe du moindre privilège que vous violez ici).
Calimo

22
Pourquoi y a-t-il une fonction de mise à jour automatique si elle ne fonctionne même pas sans changer les autorisations ??
malhal

6
@ ManuelSchneid3r, je vois des fichiers PHP sous wp-content, sont-ils vraiment censés être accessibles en écriture www-data??? Cela semble vraiment pas du tout sécurisé.
Alexis Wilke

12
Cette solution empêchera WordPress d'installer des «mises à jour de sécurité automatiques». Vous devez exécuter manuellement les étapes ci-dessus pour chaque mise à jour mineure de wordpress.
Jeroen

11
Ce n'est pas une configuration sécurisée. La définition des autorisations de lecture sur ces fichiers n'a aucun effet lorsque l'utilisateur apache possède également les fichiers! NE PAS UTILISER. Reportez-vous à codex.wordpress.org/Changing_File_Permissions
PodTech.io

60

Donner un accès complet à tous les fichiers wp à l' www-datautilisateur (qui est dans ce cas l'utilisateur du serveur Web) peut être dangereux. Donc, ne faites PAS ceci:

chown www-data:www-data -R *

Il peut cependant être utile au moment où vous installez ou mettez à niveau WordPress et ses plug-ins. Mais lorsque vous avez terminé, ce n'est plus une bonne idée de conserver les fichiers wp détenus par le serveur Web.

Il permet essentiellement au serveur Web de mettre ou d'écraser n'importe quel fichier de votre site Web. Cela signifie qu'il existe une possibilité de reprendre votre site si quelqu'un parvient à utiliser le serveur Web (ou une faille de sécurité dans un script .php) pour mettre des fichiers dans votre site Web.

Pour protéger votre site contre une telle attaque, vous devez:

Tous les fichiers doivent appartenir à votre compte utilisateur et être accessibles en écriture par vous. Tout fichier nécessitant un accès en écriture à partir de WordPress doit être accessible en écriture par le serveur Web, si votre configuration d'hébergement l'exige, cela peut signifier que ces fichiers doivent appartenir à un groupe appartenant au compte d'utilisateur utilisé par le processus du serveur Web.

/

Le répertoire racine de WordPress: tous les fichiers ne doivent être accessibles en écriture que par votre compte utilisateur, sauf .htaccess si vous souhaitez que WordPress génère automatiquement des règles de réécriture pour vous.

/wp-admin/

La zone d'administration de WordPress: tous les fichiers ne doivent être accessibles en écriture que par votre compte utilisateur.

/wp-includes/

La majeure partie de la logique d'application WordPress: tous les fichiers doivent être accessibles en écriture uniquement par votre compte d'utilisateur.

/wp-content/

Contenu fourni par l'utilisateur: destiné à être accessible en écriture par votre compte d'utilisateur et le processus du serveur Web.

Au sein /wp-content/vous trouverez:

/wp-content/themes/

Fichiers de thème. Si vous souhaitez utiliser l'éditeur de thème intégré, tous les fichiers doivent être accessibles en écriture par le processus du serveur Web. Si vous ne souhaitez pas utiliser l'éditeur de thème intégré, tous les fichiers peuvent être accessibles en écriture uniquement par votre compte d'utilisateur.

/wp-content/plugins/

Fichiers plugin: tous les fichiers doivent être accessibles en écriture uniquement par votre compte utilisateur.

Les autres répertoires qui peuvent être présents /wp-content/doivent être documentés par le plugin ou le thème qui les requiert. Les autorisations peuvent varier.

Source et informations supplémentaires: http://codex.wordpress.org/Hardening_WordPress


par votre compte utilisateur. signifie que l'utilisateur exécute les scripts php sur le site (normalement l'utilisateur apache)?
shasi kanth

4
@shasikanth Non, l'utilisateur apache est celui qu'il appelle «processus de serveur Web». Le compte utilisateur est votre utilisateur Linux (ssh, utilisateur ftp, etc.)
Daniel Bang

Dans cette réponse et dans la réponse acceptée, l'utilisateur (et non www-data) doit-il faire partie du groupe www-data?
user658182

1
Non, c'est tout l'intérêt.
Piotr Nawrot

1
Le problème que je rencontre est à chaque fois que je fais de mon "utilisateur" SSH le propriétaire de / wp-content / plugins /, Wordpress devient complètement non fonctionnel à partir de l'administrateur, avec la routine pop-up FTP constante ou les erreurs d'autorisations. Impossible d'ajouter ou de mettre à jour des plugins. Ce n'est que lorsque je fais de www-data le propriétaire de wp-content, que la fonctionnalité du plugin Wordpress Admin fonctionne. (Exemple: sudo chown www-data: www-data -R / var / www / html / wp-content /)
Heres2u

26

Pour ceux qui ont leur dossier racine wordpress sous leur dossier d'accueil:

** Ubuntu / apache

  1. Ajoutez votre utilisateur au groupe www-data:

CRÉDIT Octroi d'autorisations d'écriture au groupe www-data

Vous souhaitez faire appel usermodà votre utilisateur. Ce serait donc:

sudo usermod -aG www-data yourUserName

** En supposant que le www-datagroupe existe

  1. Vérifiez que votre utilisateur est dans le www-datagroupe:

    groups yourUserName

Vous devriez obtenir quelque chose comme:

youUserName : youUserGroupName www-data

** youUserGroupName est généralement similaire à votre nom d'utilisateur

  1. Modifier récursivement la propriété du groupe du dossier wp-content en conservant la propriété de votre utilisateur

    chown yourUserName:www-data -R youWebSiteFolder/wp-content/*

  2. Changez le répertoire en youWebSiteFolder / wp-content /

    cd youWebSiteFolder/wp-content

  3. Modifiez récursivement les autorisations de groupe des dossiers et sous-dossiers pour activer les autorisations d'écriture:

    find . -type d -exec chmod -R 775 {} \;

** le mode de `/ home / yourUserName / youWebSiteFolder / wp-content / 'est passé de 0755 (rwxr-xr-x) à 0775 (rwxrwxr-x)

  1. Modifiez récursivement les autorisations de groupe des fichiers et sous-fichiers pour activer les autorisations d'écriture:

    find . -type f -exec chmod -R 664 {} \;

Le résultat devrait ressembler à quelque chose comme:

WAS:
-rw-r--r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html
CHANGED TO:
-rw-rw-r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html

Équivalent à:

chmod -R ug + rw nom de dossier

Les autorisations seront comme 664 pour les fichiers ou 775 pour les répertoires.

Ps si quelqu'un rencontre une erreur 'could not create directory'lors de la mise à jour d'un plugin, faites:
server@user:~/domainame.com$ sudo chown username:www-data -R wp-content
lorsque vous êtes à la racine de votre domaine.
En supposant: wp-config.phppossède des
informations d'identification FTP sur LocalHost
define('FS_METHOD','direct');


10
-1. Vous ne voulez PAS que www-data ait un accès en écriture aux fichiers wordpress, sauf dans wp-content.
Calimo

775 dans wp-content aide. Avec 644 pour les fichiers, 755 pour les dossiers et utilisateur chown: www-data, j'avais parfois encore des problèmes avec le téléchargement des médias, la mise à jour du plugin, etc. 775 permet au contenu wp d'être modifié par www-data: www-data également , ce qui résout le problème.
guylabbe.ca

Supprimez le -R de la commande find / chmod car il est lent et inutile.
Adam Jimenez

20

Mieux vaut lire la documentation wordpress sur ce https://wordpress.org/support/article/changing-file-permissions/

  • Tous les fichiers doivent appartenir au compte de l'utilisateur réel et non au compte utilisateur utilisé pour le processus httpd
  • La propriété du groupe n'est pas pertinente, sauf s'il existe des exigences de groupe spécifiques pour la vérification des autorisations de processus du serveur Web. Ce n'est généralement pas le cas.
  • Tous les répertoires doivent être 755 ou 750.
  • Tous les fichiers doivent être 644 ou 640. Exception: wp-config.php doit être 440 ou 400 pour empêcher les autres utilisateurs du serveur de le lire.
  • Aucun répertoire ne devrait jamais recevoir 777, même les répertoires de téléchargement. Étant donné que le processus php s'exécute en tant que propriétaire des fichiers, il obtient les autorisations des propriétaires et peut même écrire dans un répertoire 755.

4
Vous ne savez pas pourquoi vous avez été rejeté: c'est presque comme si les gens voulaient que la meilleure réponse soit de savoir comment laisser l'installation non sécurisée !
BCran

Le lien est obsolète. nouveau ici: wordpress.org/support/article/changing-file-permissions Et merci d'être le seul à référencer les documents réels!
Everyman

Si le wp-config.php est 400, comment l'apache est-il censé l'inclure (donc le lire) lors du chargement de la page?
Martin Braun

14

J'ai défini des autorisations sur:

    # Set all files and directories user and group to wp-user
    chown wp-user:wp-user -R *

    # Set uploads folder user and group to www-data
    chown www-data:www-data -R wp-content/uploads/

    # Set all directories permissions to 755
    find . -type d -exec chmod 755 {} \;

    # Set all files permissions to 644
    find . -type f -exec chmod 644 {} \;

Dans mon cas, j'ai créé un utilisateur spécifique pour WordPress qui est différent de l'utilisateur par défaut d'apache qui empêche l'accès du Web aux fichiers appartenant à cet utilisateur.

Ensuite, il autorise l'utilisateur apache à gérer le dossier de téléchargement et enfin à définir suffisamment d'autorisations de fichiers et de dossiers.

ÉDITÉ

Si vous utilisez W3C Total Cache, vous devez également faire la suivante:

rm -rf wp-content/cache/config
rm -rf wp-content/cache/object
rm -rf wp-content/cache/db
rm -rf wp-content/cache/minify
rm -rf wp-content/cache/page_enhanced

Alors ça marchera!

ÉDITÉ

Après avoir développé des sites WordPress, je recommanderais différentes autorisations de fichiers par environnement:

En production, je ne donnerais pas accès aux utilisateurs pour modifier le système de fichiers, je leur permettrai seulement de télécharger des ressources et de donner accès à certains dossiers spécifiques aux plugins pour faire des sauvegardes, etc. Mais gérer des projets sous Git et utiliser des clés de déploiement sur le serveur, ce ne sont pas de bons plugins de mise à jour sur le staging ni la production. Je laisse ici la configuration du fichier de production:

# Set uploads folder user and group to www-data
chown www-data:www-data -R wp-content/uploads/

www-data: www-data = utilisateur et groupe apache ou nginx

Le transfert partagera les mêmes autorisations de production qu'il devrait en être un clone.

Enfin, l'environnement de développement aura accès aux plugins de mise à jour, aux traductions, tout ...

# Set uploads folder user and group to www-data
chown www-data:www-data -R wp-content/

# Set uploads folder user and group to www-data
chown your-user:root-group -R wp-content/themes

# Set uploads folder user and group to www-data
chown your-user:root-group -R wp-content/plugins/your-plugin

www-data: www-data = utilisateur apache ou nginx et groupe your-user: root-group = votre utilisateur actuel et le groupe racine

Ces autorisations vous donneront accès à développer sous themeset your-plugindossier sans demander la permission. Le reste du contenu sera la propriété de l'utilisateur Apache ou Nginx pour permettre à WP de gérer le système de fichiers.

Avant de créer un dépôt git, exécutez d'abord ces commandes:

# Set all directories permissions to 755
find . -type d -exec chmod 755 {} \;

# Set all files permissions to 644
find . -type f -exec chmod 644 {} \;

11
Nooon! Ne faites jamais de 777. Veuillez ne pas conseiller ceci aux (nouvelles) personnes qui lisent ceci.
Karlo

AUCUN fichier ou dossier ne doit appartenir au processus http - il s'agit d'une faille de sécurité majeure. Si un utilisateur malveillant a trouvé un exploit dans un plugin ou un thème ou wordpress lui-même, il pourrait télécharger du code qui peut ensuite être exécuté par apache et y accéder - je l'ai vu de première main :(
DropHit

10

Les autorisations correctes pour le fichier sont 644 Les autorisations correctes pour le dossier sont 755

Pour modifier les autorisations, utilisez le terminal et les commandes suivantes.

find foldername -type d -exec chmod 755 {} \;
find foldername -type f -exec chmod 644 {} \;

755 pour les dossiers et 644 pour les fichiers.


1
et 640 pour wp-config.php.Mais malheureusement, vous devez changer les permissions des dossiers uploads & plugins & themes en 775 et si vous voulez mettre à jour votre wordpress alors vous devez changer tous les dossiers en 775.Dans cette section vos permissions feront apparaître des erreurs lors de la mise à jour / changer les plugins, les thèmes et télécharger les médias.
erginduran

8

Je pense que les règles ci-dessous sont recommandées pour un site wordpress par défaut:

  • Pour les dossiers à l'intérieur de wp-content, définissez les autorisations 0755:

    plugins chmod -R 0755

    chmod -R 0755 uploads

    mise à niveau chmod -R 0755

  • Laissez l'utilisateur apache être le propriétaire des répertoires ci-dessus de wp-content:

    chown apache uploads

    mise à niveau apache chown

    plugins apache chown


1
Vous pouvez également définir de manière récursive les autorisations pour les répertoires, comme: chown -R apache uploads . Et si nécessaire, vous pouvez également donner la propriété du groupe à apache: chgrp apache uploads
shasi kanth

8

Cela dépend en fait des plugins que vous prévoyez d'utiliser car certains plugins changent le document racine de wordpress. mais généralement je recommande quelque chose comme ça pour le répertoire wordpress.

Cela affectera la "racine" (ou quel que soit l'utilisateur que vous utilisez) en tant qu'utilisateur dans chaque fichier / dossier, R signifie récursif, donc cela ne s'arrête pas au dossier "html". si vous n'avez pas utilisé R, il ne s'applique qu'au répertoire "html".

sudo chown -R root:www-data /var/www/html  

Cela définira le propriétaire / groupe de "wp-content" sur "www-data" et permettra ainsi au serveur Web d'installer les plugins via le panneau d'administration.

chown -R www-data:www-data /var/www/html/wp-content

Cela définira l'autorisation de chaque fichier du dossier "html" (y compris les fichiers dans les sous-répertoires) sur 644, de sorte que les personnes extérieures ne peuvent exécuter aucun fichier, modifier aucun fichier, le groupe ne peut exécuter aucun fichier, modifier n'importe quel fichier et seulement l'utilisateur est autorisé à modifier / lire des fichiers, mais même l'utilisateur ne peut exécuter aucun fichier. Ceci est important car il empêche tout type d'exécution dans le dossier "html", car le propriétaire du dossier html et de tous les autres dossiers, à l'exception du dossier wp-content, est "root" (ou votre utilisateur), le www-data peut ' t modifier tout fichier en dehors du dossier wp-content, donc même s'il y a une vulnérabilité dans le serveur web, et si quelqu'un accède au site sans autorisation, il ne peut pas supprimer le site principal à l'exception des plugins.

sudo find /var/www/html -type f -exec chmod 644 {} +

Cela restreindra la permission d'accéder à "wp-config.php" à l'utilisateur / groupe avec rw-r ----- ces autorisations.

chmod 640 /var/www/html/wp-config.php

Et si un plugin ou une mise à jour se plaignait qu'il ne pouvait pas se mettre à jour, alors accédez à SSH et utilisez cette commande, et accordez l'autorisation temporaire à "www-data" (serveur Web) pour mettre à jour / installer via le panneau d'administration, puis revenir retour à la "racine" ou à votre utilisateur une fois qu'il est terminé.

chown -R www-data /var/www/html

Et dans Nginx (même procédure pour l'apache) pour protéger le dossier wp-admin contre les accès non autorisés et les sondages. apache2-utils est requis pour crypter le mot de passe même si vous avez installé nginx, omettez c si vous prévoyez d'ajouter plus d'utilisateurs au même fichier.

sudo apt-get install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd userName

Maintenant, visitez cet endroit

/etc/nginx/sites-available/

Utilisez ces codes pour protéger le dossier "wp-admin" avec un mot de passe, maintenant il vous demandera le mot de passe / nom d'utilisateur si vous avez essayé d'accéder au "wp-admin". remarquez, ici vous utilisez le fichier ".htpasswd" qui contient le mot de passe crypté.

location ^~ /wp-admin {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
    index  index.php index.html index.htm;
}

Redémarrez maintenant le nginx.

sudo /etc/init.d/nginx restart

L'utilisation de l'utilisateur root n'est pas recommandée
Cela

Je n'ai pas préconisé ici d'utiliser la racine. J'ai utilisé la racine comme exemple. vous pouvez utiliser n'importe quel nom au lieu d'utiliser la racine.
Don Dilanga

2

Commandes:

chown www-data:www-data -R *
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Où ftp-user est l'utilisateur que vous utilisez pour télécharger les fichiers

chown -R ftp-user:www-data wp-content
chmod -R 775 wp-content

1
devrait être affiché nom d'utilisateur: www-data sinon vous ne pouvez pas modifier les fichiers
malhal

Vous pouvez utiliser à la $(whoami)place de ftp-user. Par défaut, votre utilisateur actuel ( pas root ) est votre utilisateur FTP si vous utilisez votre propre serveur (local, vps, etc.)
Juanjo Salvador

2

Pour vous assurer absolument que votre site Web est sécurisé et que vous utilisez les autorisations appropriées pour vos dossiers, utilisez un plugin de sécurité comme ceux-ci:

https://en-ca.wordpress.org/plugins/all-in-one-wp-security-and-firewall/

https://en-ca.wordpress.org/plugins/wordfence/

Ces plugins analyseront votre installation Wordpress et vous informeront de tout problème potentiel. Ceux-ci vous avertiront également des autorisations de dossier non sécurisées. En plus de cela, ces plugins vous recommanderont les autorisations à attribuer aux dossiers.


2
chown -Rv www-data:www-data
chmod -Rv 0755 wp-includes
chmod -Rv 0755 wp-admin/js
chmod -Rv 0755 wp-content/themes
chmod -Rv 0755 wp-content/plugins
chmod -Rv 0755 wp-admin
chmod -Rv 0755 wp-content
chmod -v 0644 wp-config.php
chmod -v 0644 wp-admin/index.php
chmod -v 0644 .htaccess

1

Je ne peux pas vous dire si cela est correct ou non, mais j'utilise une image Bitnami sur Google Compute App Engine. J'ai des problèmes avec les plugins et la migration, et après avoir gâché les choses en chmodant les autorisations, j'ai trouvé ces trois lignes qui ont résolu tous mes problèmes. Je ne sais pas si c'est la bonne façon mais cela a fonctionné pour moi.

sudo chown -R bitnami:daemon /opt/bitnami/apps/wordpress/htdocs/
sudo find /opt/bitnami/apps/wordpress/htdocs/ -type f -exec chmod 664 {} \;
sudo find /opt/bitnami/apps/wordpress/htdocs/ -type d -exec chmod 775 {} \;

1

Pour OS X, utilisez cette commande:

sudo chown -R www:www /www/folder_name

1

Définissez dans le fichier wp_config.

/var/www/html/Your-Project-File/wp-config.php

define( 'FS_METHOD', 'direct' );

chown - change la propriété des fichiers / répertoires. C'est à dire. le propriétaire du fichier / dir change en celui spécifié, mais il ne modifie pas les autorisations.

sudo chown -R www-data:www-data /var/www

0

Sur la base de toutes les lectures et agonisations sur mes propres sites et après avoir été piraté, j'ai trouvé la liste ci-dessus qui inclut les autorisations pour un plugin de sécurité pour Wordpress appelé Wordfence. (Non affilié à elle)

Dans notre exemple, la racine du document wordpress est /var/www/html/example.com/public_html

Ouvrez les autorisations pour que www-data puisse écrire à la racine du document comme suit:

cd /var/www/html/example.com
sudo chown -R www-data:www-data public_html/

À partir du tableau de bord de votre site, en tant qu'administrateur, vous pouvez effectuer des mises à jour.

Site sécurisé une fois les mises à jour terminées en procédant comme suit:

sudo chown -R wp-user:wp-user public_html/

La commande ci-dessus modifie les autorisations de tout dans l'installation wordpress pour l'utilisateur FTP wordpress.

cd public_html/wp-content
sudo chown -R www-data:wp-user wflogs
sudo chown -R www-data:wp-user uploads

La commande ci-dessus garantit que le plugin de sécurité Wordfence a accès à ses journaux. Le répertoire des téléchargements est également accessible en écriture par www-data.

cd plugins
sudo chown -R www-data:wp-user wordfence/

La commande ci-dessus garantit également que le plug-in de sécurité a requis un accès en lecture-écriture pour son bon fonctionnement.

Autorisations sur les répertoires et les fichiers

# Set all directories permissions to 755
find . -type d -exec chmod 755 {} \;

# Set all files permissions to 644
find . -type f -exec chmod 644 {} \;

Définissez les autorisations pour wp-config.php sur 640 afin que seul wp-user puisse lire ce fichier et personne d'autre. Les autorisations de 440 ne fonctionnaient pas pour moi avec la propriété du fichier ci-dessus.

sudo chmod 640 wp-config.php

Les mises à jour automatiques de Wordpress utilisant SSH fonctionnaient correctement avec PHP5 mais ont rompu avec PHP7.0 en raison de problèmes avec php7.0-ssh2 bundeld avec Ubuntu 16.04 et je n'ai pas trouvé comment installer la bonne version et la faire fonctionner. Heureusement, un plugin très fiable appelé ssh-sftp-updater-support (gratuit) rend possible les mises à jour automatiques en utilisant SFTP sans avoir besoin de libssh2. Ainsi, les autorisations ci-dessus ne doivent jamais être assouplies, sauf dans de rares cas si nécessaire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.