diff --git a/core/modules/system/src/Tests/System/SitesDirectoryHardeningTest.php b/core/modules/system/src/Tests/System/SitesDirectoryHardeningTest.php
new file mode 100644
index 0000000..40d25d5
--- /dev/null
+++ b/core/modules/system/src/Tests/System/SitesDirectoryHardeningTest.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\System\SitesDirectoryHardeningTest.
+ */
+
+namespace Drupal\system\Tests\System;
+
+use Drupal\Core\Site\Settings;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Test unicode handling features implemented in unicode.inc.
+ */
+class SitesDirectoryHardeningTest extends WebTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Sites directory hardening',
+      'description' => 'Tests Drupal permissions hardening of /sites subdirectories.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Test that the default behavior to restrict permissions on the current
+   * sites directory and on settings.php is enforced.
+   */
+  function testSitesDirectoryHardening() {
+    $site_path = $this->kernel->getSitePath();
+    $settings_file = $site_path . '/settings.php';
+
+    // First, we check based on what the initial install has set.
+    $this->assertTrue(drupal_verify_install_file($site_path, FILE_NOT_WRITABLE, 'dir'), t('Verified permissions for !file.', array('!file' => $site_path)));
+
+    // We intentionally don't check for settings.local.php as that file is
+    // not created by Drupal.
+    $this->assertTrue(drupal_verify_install_file($settings_file, FILE_EXIST|FILE_READABLE|FILE_NOT_WRITABLE), t('Verified permissions for !file.', array('!file' => $settings_file)));
+
+    // Intentionally make our sites directory and settings.php writable.
+    chmod($site_path, 0744);
+    chmod($settings_file, 0744);
+
+    // Manually trigger the requirements check.
+    module_load_install('system');
+    system_requirements('runtime');
+
+    $this->assertTrue(drupal_verify_install_file($site_path, FILE_NOT_WRITABLE, 'dir'), t('Verified permissions for !file after manual permissions change.', array('!file' => $site_path)));
+    $this->assertTrue(drupal_verify_install_file($settings_file, FILE_EXIST|FILE_READABLE|FILE_NOT_WRITABLE), t('Verified permissions for !file after manual permissions change.', array('!file' => $settings_file)));
+  }
+
+  /**
+   * Test that when when directory hardening is disabled that a writable file
+   * remains writable.
+   */
+  function testSitesDirectoryHardeningConfig() {
+    $site_path = $this->kernel->getSitePath();
+    $settings_file = $site_path . '/settings.php';
+
+    // Disable permissions enforcement.
+    $settings = Settings::getAll();
+    $settings['sites_permissions'] = TRUE;
+    new Settings($settings);
+    $this->assertTrue(Settings::get('sites_permissions'), 'Able to set to true');
+
+    // Intentionally make our sites directory and settings.php writable.
+    chmod($site_path, 0744);
+    chmod($settings_file, 0744);
+
+    // Manually trigger the requirements check.
+    module_load_install('system');
+    system_requirements('runtime');
+
+    $this->assertTrue(is_writable($site_path), t('Site directory remains writable when automatically fixing permissions is disabled.'));
+    $this->assertTrue(is_writable($settings_file), t('settings.php remains writable when automatically fixing permissions is disabled.'));
+
+    // Re-enable permissions enforcement.
+    $settings = Settings::getAll();
+    $settings['sites_permissions'] = FALSE;
+    new Settings($settings);
+
+    // Manually trigger the requirements check.
+    module_load_install('system');
+    system_requirements('runtime');
+
+    $this->assertFalse(is_writable($site_path), t('Site directory is protected when automatically fixing permissions is enabled.'));
+    $this->assertFalse(is_writable($settings_file), t('settings.php is protected when automatically fixing permissions is enabled.'));
+  }
+}
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 8addfd1..7cde3dd 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -365,12 +365,21 @@ function system_requirements($phase) {
     else {
       $site_path = DrupalKernel::findSitePath(Request::createFromGlobals());
     }
-    if (!drupal_verify_install_file($site_path, FILE_NOT_WRITABLE, 'dir')) {
+    // Allow system administrators to ignore permissions hardening for the site
+    // directory. This allows additional files in the site directory to be
+    // updated when they are managed in a version control system.
+    if (Settings::get('sites_permissions')) {
+      $message = t('Protection disabled');
+      $severity = REQUIREMENT_WARNING;
+    }
+    elseif (!drupal_verify_install_file($conf_path, FILE_NOT_WRITABLE, 'dir')) {
+      $message = t('Not protected');
+      $severity = REQUIREMENT_ERROR;
       $conf_errors[] = t("The directory %file is not protected from modifications and poses a security risk. You must change the directory's permissions to be non-writable.", array('%file' => $site_path));
     }
     foreach (array('settings.php', 'settings.local.php', 'services.yml') as $conf_file) {
       $full_path = $site_path . '/' . $conf_file;
-      if (file_exists($full_path) && !drupal_verify_install_file($full_path, FILE_EXIST|FILE_READABLE|FILE_NOT_WRITABLE)) {
+      if (file_exists($full_path) && (Settings::get('sites_permissions') || !drupal_verify_install_file($full_path, FILE_EXIST|FILE_READABLE|FILE_NOT_WRITABLE))) {
         $conf_errors[] = t("The file %file is not protected from modifications and poses a security risk. You must change the file's permissions to be non-writable.", array('%file' => $full_path));
       }
     }
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index 376c577..7500eb6 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -526,7 +526,19 @@
  * Note: This setting does not apply to installation and update pages.
  */
 # $settings['maintenance_theme'] = 'bartik';
-
+/**
+ * Override file system permissions hardening.
+ *
+ * The system module will periodically check the permissions of your site's
+ * site directory to ensure that it is not writable by the website user. For
+ * sites that are managed with a version control system, this can cause problems
+ * when files in that directory (such as a "settings.inc" containing additional
+ * configuration) are updated, because the user pulling in the changes won't
+ * have permissions to modify files in the directory.
+ *
+ * Remove the leading hash sign to disable permissions hardening.
+ */
+# $settings['sites_permissions'] = TRUE;
 /**
  * PHP settings:
  *
