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..d8f2c58
--- /dev/null
+++ b/core/modules/system/src/Tests/System/SitesDirectoryHardeningTest.php
@@ -0,0 +1,92 @@
+<?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.
+ *
+ * @group system
+ */
+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['skip_permissions_hardening'] = TRUE;
+    new Settings($settings);
+    $this->assertTrue(Settings::get('skip_permissions_hardening'), '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['skip_permissions_hardening'] = 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..14a70c3 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('skip_permissions_hardening')) {
+      $message = t('Protection disabled');
+      $severity = REQUIREMENT_WARNING;
+    }
+    elseif (!drupal_verify_install_file($site_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('skip_permissions_hardening') || !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/example.settings.local.php b/sites/example.settings.local.php
index a5d50f2..0626967 100644
--- a/sites/example.settings.local.php
+++ b/sites/example.settings.local.php
@@ -90,3 +90,17 @@
  * using these parameters in a request to rebuild.php.
  */
 $settings['rebuild_access'] = TRUE;
+
+/**
+ * Skip 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['skip_permissions_hardening'] = TRUE;
