diff --git a/config_help.module b/config_help.module
index c770667..d284daf 100644
--- a/config_help.module
+++ b/config_help.module
@@ -74,3 +74,19 @@ function config_help_theme($existing, $type, $theme, $path) {
     ),
   );
 }
+
+/**
+ * Implements hook_help_section_info_alter().
+ *
+ * Add a permission for each help section.
+ *
+ * @see hook_help_section_info_alter().
+ */
+function config_help_help_section_info_alter(&$info) {
+  foreach ($info as &$help) {
+    if (empty($help['permission'])) {
+      $help['permission'] = "view {$help['id']} help";
+      $help['generate_permission'] = TRUE;
+    }
+  }
+}
diff --git a/config_help.permissions.yml b/config_help.permissions.yml
index c072b6e..4a8b19c 100644
--- a/config_help.permissions.yml
+++ b/config_help.permissions.yml
@@ -5,3 +5,6 @@ view help topics:
   title: 'View configured help topics'
 administer help topic locking:
   title: 'Lock and unlock configured help topics'
+
+permission_callbacks:
+  - \Drupal\config_help\HelpPermissions::helpSectionPermissions
diff --git a/src/HelpPermissions.php b/src/HelpPermissions.php
new file mode 100644
index 0000000..3baba76
--- /dev/null
+++ b/src/HelpPermissions.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Drupal\config_help;
+
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+class HelpPermissions {
+
+  use StringTranslationTrait;
+
+  public function helpSectionPermissions() {
+    $permissions = [];
+    $sections = \Drupal::service('plugin.manager.help_section')->getDefinitions();
+    foreach ($sections as $section) {
+      if (!empty($section['generate_permission'])) {
+        $permissions += $this->buildPermissions($section);
+      }
+    }
+    return $permissions;
+  }
+
+  protected function buildPermissions($section) {
+    return [
+      $section['permission'] => [
+        'title' => $this->t('View help: %help_label', ['%help_label' => $section['title']])
+      ],
+    ];
+  }
+
+}
