Sécuriser WordPress 3 : Désactiver ou limiter l’usage de l’XML RPC et l’API REST

La version 4.7.2 de wordpress corrige entre autres un bug au niveau de l’authentification dans API REST de WordPress. Mais dans tous les cas, il vaut mieux prévenir que guérir. C’est pour cela que je vous propose, en fonction de vos possibilités de limiter ou de désactiver ces fonctionnalités qui ne vous sont peut-être pas utiles.

Pour commencer, si vous savez vaguement ce que sont le service XML-RPC et l’API REST de wordpress, il y a toutes les chances qu’il vaille mieux que vous désactiviez ces deux fonctionnalités.

L’XML RPC et l’API REST sont deux moyens qui vous permettent de modifier le contenu de votre WordPress à distance à travers d’autres services. De ce fait, ils permettent à des personnes malveillantes de faire de même si un bug leur permet.

Il y a plusieurs solutions, la plus sûre étant de limiter l’accès directement au niveau du serveur web. Il y a 2 méthodes pour cela, le fichier de configuration de votre serveur, ou un fichier .htaccess. C’est mieux si vous avez directement accès aux réglages d’apache, mais cela n’est possible que si vous possédez un serveur dédié. Dans le cas d’un hébergement sur un service partagé, le fichier .htaccess permet les mêmes directives. Le seul problème est qu’il est directement à la racine de votre site web, donc, en cas de trou de sécurité, peut être plus facilement utilisé.

À travers Apache

Quoi qu’il en soit, voici les directives que vous pouvez utiliser, soit dans le fichier apache (à l’intérieur de VirtualHost) soit dans le .htaccess :

# xmlrpc non disponible
<Files xmlrpc.php>
 order deny,allow
 deny from all
 #si jetpack et en europe
 Allow from 192.0.64.0/18
</Files>

Pour les utilisateurs de JetPack, ils vous faut ajouter les ip de leur service ( 192.0.64.0/18 ), afin de les autoriser à prendre la main à travers l’interface de wordpress.com . Sinon supprimer cette ligne de l’exemple.

Il est possible aussi de modifier les réglages de sécurité de jetpack, dans jetpack > Réglages > Sécurité > Protect, ouvrir le block et ajoutez-y l’ip de jetpack par exemple ou les vôtres si nécessaire.

Au passage, cette directive Apache peut être aussi utilisée pour limiter les accès extérieurs à votre site sur tous les fichiers sensibles comme le wp-config.php par exemple.

En utilisant le fichier fonction.php de votre thème

Il vous suffit d’ajouter les lignes suivantes :

	
	// desactiver l'XML RPC
	remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
	remove_action( 'wp_head', 'rsd_link' );
	add_filter( 'xmlrpc_enabled', '__return_false' );
	remove_action( 'wp_head', 'rsd_link' );
	// désactiver l'accès a l'API REST
	remove_action( 'init',          'rest_api_init' );
	remove_action( 'parse_request', 'rest_api_loaded' );
	remove_action( 'wp_head',                    'rest_output_link_wp_head' );
	remove_action( 'template_redirect',          'rest_output_link_header', 11 );
	remove_action( 'auth_cookie_malformed',      'rest_cookie_collect_status' );
	remove_action( 'auth_cookie_expired',        'rest_cookie_collect_status' );
	remove_action( 'auth_cookie_bad_username',   'rest_cookie_collect_status' );
	remove_action( 'auth_cookie_bad_hash',       'rest_cookie_collect_status' );
	remove_action( 'auth_cookie_valid',          'rest_cookie_collect_status' );
	add_filter( 'rest_enabled',       '__return_false' );
	add_filter( 'rest_jsonp_enabled', '__return_false' );

Ou si vous avez besoin de permettre l’accès à l’API, la fonction suivante peut vous être utile afin de limiter cela plus finement :

// pour autoriser l'acces API REST uniquement au 
// utilisateurs authentifié

function rest_api_secure( $access ) {

    if( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_cannot_access', __( 'Accès réservé', 'disable-json-api' ), array( 'status' => rest_authorization_required_code() ) );
    }

    return $access;
}
add_filter( 'rest_authentication_errors', 'rest_api_secure' );

Bon WP !

3.20 avg. rating (64% score) - 75 votes