Настройка Grafana HTTPS для защищённого веб-трафика

При доступе к интерфейсу Grafana через веб важно настроить HTTPS, чтобы обеспечить шифрование обмена данными между Grafana и конечным пользователем, включая учётные данные для входа и получаемые данные метрик.

Чтобы обеспечить защищённый трафик через интернет, Grafana должна иметь ключ для шифрования и сертификат Secure Socket Layer (SSL) для подтверждения подлинности сайта.

На следующем изображении показан значок замка в браузере, который подтверждает, что соединение безопасно.

Secure HTTPS connection
Secure HTTPS connection

В этом разделе показано, как:

  1. Получить сертификат и ключ
  2. Настроить Grafana HTTPS
  3. Перезапустить сервер Grafana

Перед началом

Чтобы следовать этим инструкциям, вам потребуется:

  • У вас должен быть доступ к оболочке системы и доступ sudo для выполнения действий от имени root или администратора.
  • Для варианта с подписанным сертификатом CA вам нужно доменное имя, которым вы владеете и которое связано с используемой вами машиной.

Получение сертификата и ключа

Для получения сертификата и ключа можно использовать один из двух методов. Более быстрый и простой вариант с самоподписанным сертификатом может показывать пользователю предупреждения браузера, которые ему придётся принимать при каждом посещении сайта. В качестве альтернативы вариант с подписью центра сертификации (CA) требует больше шагов для выполнения, но обеспечивает полное доверие со стороны браузера. Чтобы узнать больше о разнице между этими вариантами, см. Разница между самоподписанным CA и самоподписанным сертификатом.

Генерация самоподписанного сертификата

В этом разделе показано, как использовать инструменты openssl для генерации всех необходимых файлов из командной строки.

  1. Выполните следующую команду, чтобы сгенерировать 2048-битный приватный ключ RSA, который используется для расшифровки трафика:

    Bash
    sudo openssl genrsa -out /etc/grafana/grafana.key 2048
  2. Выполните следующую команду, чтобы сгенерировать сертификат, используя приватный ключ из предыдущего шага.

    Bash
    sudo openssl req -new -key /etc/grafana/grafana.key -out /etc/grafana/grafana.csr

    При появлении запроса ответьте на вопросы, которые могут включать ваше полное доменное имя, адрес электронной почты, код страны и другие. Следующий пример похож на запросы, которые вы увидите.

    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:US
    State or Province Name (full name) [Some-State]:Virginia
    Locality Name (eg, city) []:Richmond
    Organization Name (eg, company) [Internet Pty Ltd]:
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:subdomain.mysite.com
    Email Address []:me@mysite.com
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
  3. Выполните следующую команду, чтобы самоподписать сертификат с помощью приватного ключа, со сроком действия 365 дней:

    Bash
    sudo openssl x509 -req -days 365 -in /etc/grafana/grafana.csr -signkey /etc/grafana/grafana.key -out /etc/grafana/grafana.crt
  4. Выполните следующие команды, чтобы установить соответствующие разрешения для файлов:

    Bash
    sudo chown grafana:grafana /etc/grafana/grafana.crt
    sudo chown grafana:grafana /etc/grafana/grafana.key
    sudo chmod 400 /etc/grafana/grafana.key /etc/grafana/grafana.crt

    Примечание: При использовании этих файлов браузеры могут выдавать предупреждения для получившегося веб-сайта, поскольку сторонний источник не доверяет сертификату. Браузеры будут показывать предупреждения о доверии; однако соединение останется зашифрованным.

    На следующем изображении показано небезопасное соединение HTTP.

    Insecure HTTPS connection
    Insecure HTTPS connection

Получение подписанного сертификата от LetsEncrypt

LetsEncrypt — это некоммерческий центр сертификации, который предоставляет сертификаты бесплатно. Для подписанных сертификатов доступно множество компаний и центров сертификации (CA). Принципы генерации сертификатов могут немного различаться в зависимости от поставщика, но в целом остаются одинаковыми.

В примерах этого раздела используется LetsEncrypt, поскольку он бесплатный.

Note

Приведённые в этом разделе инструкции предназначены для системы Linux на базе Debian. Для других дистрибутивов и операционных систем см. инструкции certbot. Кроме того, эти инструкции требуют наличия доменного имени, которое вы контролируете. Динамические доменные имена, например от Amazon EC2 или провайдеров DynDNS, работать не будут.

Установка snapd и certbot

certbot — это программа с открытым исходным кодом, используемая для управления сертификатами LetsEncrypt, а snapd — инструмент, помогающий запускать certbot и устанавливать сертификаты.

  1. Чтобы установить snapd, выполните следующие команды:

    Bash
    sudo apt-get install snapd
    sudo snap install core; sudo snap refresh core
  2. Выполните следующие команды для установки:

    Bash
    sudo apt-get remove certbot
    sudo snap install --classic certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot

    Эти команды:

    • Удаляют certbot из вашей системы, если он был установлен с помощью менеджера пакетов
    • Устанавливают certbot с помощью snapd

Генерация сертификатов с помощью certbot

Команда sudo certbot certonly --standalone предлагает вам ответить на вопросы, прежде чем сгенерировать сертификат. Этот процесс временно открывает службу на порту 80, которую LetsEncrypt использует для проверки связи с вашим хостом.

Чтобы сгенерировать сертификаты с помощью certbot, выполните следующие шаги:

  1. Убедитесь, что трафик через порт 80 разрешён применимыми правилами брандмауэра.

  2. Выполните следующую команду, чтобы сгенерировать сертификаты:

    Bash
    $ sudo certbot certonly --standalone
    
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Enter email address (used for urgent renewal and security notices)
    (Enter 'c' to cancel): me@mysite.com
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Please read the Terms of Service at
    https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
    agree in order to register with the ACME server. Do you agree?
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (Y)es/(N)o: y
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Would you be willing, once your first certificate is successfully issued, to
    share your email address with the Electronic Frontier Foundation, a founding
    partner of the Let’s Encrypt project and the non-profit organization that
    develops Certbot? We’d like to send you email about our work encrypting the web,
    EFF news, campaigns, and ways to support digital freedom.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (Y)es/(N)o: n
    Account registered.
    Please enter the domain name(s) you would like on your certificate (comma and/or
    space separated) (Enter 'c' to cancel): subdomain.mysite.com
    Requesting a certificate for subdomain.mysite.com
    
    Successfully received certificate.
    Certificate is saved at: /etc/letsencrypt/live/subdomain.mysite.com/fullchain.pem
    Key is saved at:         /etc/letsencrypt/live/subdomain.mysite.com/privkey.pem
    This certificate expires on 2023-06-20.
    These files will be updated when the certificate renews.
    Certbot has set up a scheduled task to automatically renew this certificate in the background.
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    If you like Certbot, please consider supporting our work by:
    * Donating to ISRG / Let’s Encrypt:   https://letsencrypt.org/donate
    * Donating to EFF:                    https://eff.org/donate-le
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Символические ссылки, также известные как symlinks, позволяют создавать указатели на существующие файлы LetsEncrypt в каталоге /etc/grafana. Используя символические ссылки вместо копирования файлов, вы можете применять certbot для обновления или запроса обновлённых сертификатов у LetsEncrypt без необходимости перенастраивать параметры Grafana.

Чтобы настроить символические ссылки на Grafana, выполните следующие команды:

Bash
$ sudo ln -s /etc/letsencrypt/live/subdomain.mysite.com/privkey.pem /etc/grafana/grafana.key
$ sudo ln -s /etc/letsencrypt/live/subdomain.mysite.com/fullchain.pem /etc/grafana/grafana.crt

Настройка разрешений

Grafana обычно работает под Linux-группой grafana, и вы должны убедиться, что процесс сервера Grafana имеет разрешение на чтение соответствующих файлов. Без доступа на чтение HTTPS-сервер не сможет нормально запуститься.

Чтобы настроить разрешения, выполните следующие шаги:

  1. Выполните следующие команды, чтобы установить соответствующие разрешения и группы для файлов:

    Bash
    $ sudo chgrp -R grafana /etc/letsencrypt/*
    $ sudo chmod -R g+rx /etc/letsencrypt/*
    $ sudo chgrp -R grafana /etc/grafana/grafana.crt /etc/grafana/grafana.key
    $ sudo chmod 440 /etc/grafana/grafana.crt /etc/grafana/grafana.key
  2. Выполните следующую команду, чтобы убедиться, что группа grafana может читать символические ссылки:

    Bash
    $ $ ls -l /etc/grafana/grafana.*
    
    lrwxrwxrwx 1 root grafana    67 Mar 22 14:15 /etc/grafana/grafana.crt -> /etc/letsencrypt/live/subdomain.mysite.com/fullchain.pem
    -rw-r----- 1 root grafana 54554 Mar 22 14:13 /etc/grafana/grafana.ini
    lrwxrwxrwx 1 root grafana    65 Mar 22 14:15 /etc/grafana/grafana.key -> /etc/letsencrypt/live/subdomain.mysite.com/privkey.pem

Настройка Grafana HTTPS и перезапуск Grafana

В этом разделе вы редактируете файл grafana.ini, чтобы он включал созданный вами сертификат. Если вам нужна помощь в определении того, где найти этот файл или что означает каждый ключ, см. Расположение файла конфигурации.

Чтобы настроить Grafana HTTPS и перезапустить Grafana, выполните следующие шаги.

  1. Откройте файл grafana.ini и отредактируйте следующие параметры конфигурации:

    [server]
    http_addr =
    http_port = 3000
    domain = mysite.com
    root_url = https://subdomain.mysite.com:3000
    cert_key = /etc/grafana/grafana.key
    cert_file = /etc/grafana/grafana.crt
    enforce_domain = False
    protocol = https

    Примечание: Стандартный порт для трафика SSL — 443, который можно использовать вместо порта 3000 по умолчанию в Grafana. Это изменение может потребовать дополнительных привилегий операционной системы или конфигурации для привязки к привилегированным портам с меньшими номерами.

  2. Необязательно. Начиная с Grafana v11.2, отредактируйте параметр конфигурации cert_pass, указав пароль для расшифровки, если вы используете зашифрованные сертификаты.

  3. Перезапустите сервер Grafana с помощью systemd, init.d или бинарного файла, в зависимости от того, что подходит для вашей среды.

Устранение неполадок

При необходимости обратитесь к следующим советам по устранению неполадок.

Не удаётся получить сертификат

Следующие причины объясняют, почему процесс certbot может завершиться неудачей:

  • Чтобы убедиться, что вы можете получить сертификат от LetsEncrypt, необходимо обеспечить, чтобы порт 80 был открыт, чтобы LetsEncrypt мог взаимодействовать с вашей машиной. Если порт 80 заблокирован или включён брандмауэр, обмен данными завершится неудачей и вы не сможете получить сертификат.
  • LetsEncrypt требует доказательства того, что вы контролируете домен, поэтому попытки получить сертификаты для доменов, которые вы не контролируете, могут быть отклонены.

Grafana запускается, но HTTPS недоступен

При настройке HTTPS в логах Grafana могут появляться следующие ошибки.

Доступ запрещён

level=error msg="Stopped background service" service=*api.HTTPServer reason="open /etc/grafana/grafana.crt: permission denied"
Решение

Чтобы обеспечить безопасную настройку HTTPS, крайне важно, чтобы криптографические ключи и сертификаты были максимально ограничены. Однако если разрешения на файлы слишком ограничены, процесс Grafana может не иметь доступа к необходимым файлам, что препятствует успешной настройке HTTPS. Пожалуйста, пересмотрите перечисленные инструкции, чтобы перепроверить разрешения на файлы, и попробуйте снова.

Не удаётся назначить запрошенный адрес

listen tcp 34.148.30.243:3000: bind: cannot assign requested address
Решение

Проверьте конфигурацию, чтобы убедиться, что http_addr оставлен пустым, что позволяет Grafana привязываться ко всем интерфейсам. Если вы задали http_addr как конкретный поддомен, например subdomain.mysite.com, это может помешать процессу Grafana привязаться к внешнему адресу из-за наличия слоёв преобразования сетевых адресов.