Настройка Grafana HTTPS для защищённого веб-трафика
При доступе к интерфейсу Grafana через веб важно настроить HTTPS, чтобы обеспечить шифрование обмена данными между Grafana и конечным пользователем, включая учётные данные для входа и получаемые данные метрик.
Чтобы обеспечить защищённый трафик через интернет, Grafana должна иметь ключ для шифрования и сертификат Secure Socket Layer (SSL) для подтверждения подлинности сайта.
На следующем изображении показан значок замка в браузере, который подтверждает, что соединение безопасно.
В этом разделе показано, как:
- Получить сертификат и ключ
- Настроить Grafana HTTPS
- Перезапустить сервер Grafana
Перед началом
Чтобы следовать этим инструкциям, вам потребуется:
- У вас должен быть доступ к оболочке системы и доступ
sudoдля выполнения действий от имени root или администратора. - Для варианта с подписанным сертификатом CA вам нужно доменное имя, которым вы владеете и которое связано с используемой вами машиной.
Получение сертификата и ключа
Для получения сертификата и ключа можно использовать один из двух методов. Более быстрый и простой вариант с самоподписанным сертификатом может показывать пользователю предупреждения браузера, которые ему придётся принимать при каждом посещении сайта. В качестве альтернативы вариант с подписью центра сертификации (CA) требует больше шагов для выполнения, но обеспечивает полное доверие со стороны браузера. Чтобы узнать больше о разнице между этими вариантами, см. Разница между самоподписанным CA и самоподписанным сертификатом.
Генерация самоподписанного сертификата
В этом разделе показано, как использовать инструменты openssl для генерации всех необходимых файлов из командной строки.
-
Выполните следующую команду, чтобы сгенерировать 2048-битный приватный ключ RSA, который используется для расшифровки трафика:
sudo openssl genrsa -out /etc/grafana/grafana.key 2048 -
Выполните следующую команду, чтобы сгенерировать сертификат, используя приватный ключ из предыдущего шага.
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 []: -
Выполните следующую команду, чтобы самоподписать сертификат с помощью приватного ключа, со сроком действия 365 дней:
sudo openssl x509 -req -days 365 -in /etc/grafana/grafana.csr -signkey /etc/grafana/grafana.key -out /etc/grafana/grafana.crt -
Выполните следующие команды, чтобы установить соответствующие разрешения для файлов:
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
Получение подписанного сертификата от LetsEncrypt
LetsEncrypt — это некоммерческий центр сертификации, который предоставляет сертификаты бесплатно. Для подписанных сертификатов доступно множество компаний и центров сертификации (CA). Принципы генерации сертификатов могут немного различаться в зависимости от поставщика, но в целом остаются одинаковыми.
В примерах этого раздела используется LetsEncrypt, поскольку он бесплатный.
Note
Приведённые в этом разделе инструкции предназначены для системы Linux на базе Debian. Для других дистрибутивов и операционных систем см. инструкции certbot. Кроме того, эти инструкции требуют наличия доменного имени, которое вы контролируете. Динамические доменные имена, например от Amazon EC2 или провайдеров DynDNS, работать не будут.
Установка snapd и certbot
certbot — это программа с открытым исходным кодом, используемая для управления сертификатами LetsEncrypt, а snapd — инструмент, помогающий запускать certbot и устанавливать сертификаты.
-
Чтобы установить
snapd, выполните следующие команды:sudo apt-get install snapd sudo snap install core; sudo snap refresh core -
Выполните следующие команды для установки:
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, выполните следующие шаги:
-
Убедитесь, что трафик через порт
80разрешён применимыми правилами брандмауэра. -
Выполните следующую команду, чтобы сгенерировать сертификаты:
$ 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Настройка символических ссылок на Grafana
Символические ссылки, также известные как symlinks, позволяют создавать указатели на существующие файлы LetsEncrypt в каталоге /etc/grafana. Используя символические ссылки вместо копирования файлов, вы можете применять certbot для обновления или запроса обновлённых сертификатов у LetsEncrypt без необходимости перенастраивать параметры Grafana.
Чтобы настроить символические ссылки на Grafana, выполните следующие команды:
$ 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-сервер не сможет нормально запуститься.
Чтобы настроить разрешения, выполните следующие шаги:
-
Выполните следующие команды, чтобы установить соответствующие разрешения и группы для файлов:
$ 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 -
Выполните следующую команду, чтобы убедиться, что группа
grafanaможет читать символические ссылки:$ $ 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, выполните следующие шаги.
-
Откройте файл
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. Это изменение может потребовать дополнительных привилегий операционной системы или конфигурации для привязки к привилегированным портам с меньшими номерами.
-
Необязательно. Начиная с Grafana v11.2, отредактируйте параметр конфигурации
cert_pass, указав пароль для расшифровки, если вы используете зашифрованные сертификаты. -
Перезапустите сервер 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 привязаться к внешнему адресу из-за наличия слоёв преобразования сетевых адресов.