그라파나

인증 프록시 인증

구일칠구 2022. 7. 13. 06:34

인증 프록시 인증

HTTP 역방향 프록시가 인증을 처리하도록 Grafana를 구성할 수 있습니다. 인기 있는 웹 서버에는 플러그 가능한 인증 모듈의 매우 광범위한 목록이 있으며 이들 중 어느 것이든 AuthProxy 기능과 함께 사용할 수 있습니다. 아래에서 인증 프록시에 대한 구성 옵션을 자세히 설명합니다.

[auth.proxy]
  # Defaults to false, but set to true to enable this feature
  enabled = true
  # HTTP Header name that will contain the username or email
  header_name = X-WEBAUTH-USER
  # HTTP Header property, defaults to `username` but can also be `email`
  header_property = username
  # Set to `true` to enable auto sign up of users who do not exist in Grafana DB. Defaults to `true`.
  auto_sign_up = true
  # Define cache time to live in minutes
  # If combined with Grafana LDAP integration it is also the sync interval
  sync_ttl = 60
  # Limit where auth proxy requests come from by configuring a list of IP addresses.
  # This can be used to prevent users spoofing the X-WEBAUTH-USER header.
  # Example `whitelist = 192.168.1.1, 192.168.1.0/24, 2001::23, 2001::0/120`
  whitelist =
  # Optionally define more headers to sync other user attributes
  # Example `headers = Name:X-WEBAUTH-NAME Role:X-WEBAUTH-ROLE Email:X-WEBAUTH-EMAIL Groups:X-WEBAUTH-GROUPS`
  headers =
  # Non-ASCII strings in header values are encoded using quoted-printable encoding
  ;headers_encoded = false
  # Check out docs on this for more details on the below setting
  enable_login_token = false
  
세게 때리다

curl을 통해 Grafana의 AuthProxy와 상호 작용

curl -H "X-WEBAUTH-USER: admin"  http://localhost:3000/api/users
  [
  {
  "id":1,
  "name":"",
  "login":"admin",
  "email":"admin@localhost",
  "isAdmin":true
  }
  ]
  
세게 때리다

그런 다음 /api/user로그인한 사용자의 세부 정보를 반환하는 두 번째 요청을 메서드에 보낼 수 있습니다. 이 요청을 사용하여 Grafana가 우리가 지정한 새 사용자를 시스템에 자동으로 추가하는 방법을 보여줍니다. 여기에서 "anthony"라는 새 사용자를 만듭니다.

curl -H "X-WEBAUTH-USER: anthony" http://localhost:3000/api/user
  {
  "email":"anthony",
  "name":"",
  "login":"anthony",
  "theme":"",
  "orgId":1,
  "isGrafanaAdmin":false
  }
  
세게 때리다

Apache의 인증이 Grafana의 AuthProxy와 함께 작동하도록 만들기

사용자 인증을 위해 Apache를 사용하는 방법을 보여드리겠습니다. 이 예에서 우리는 Apache의 텍스트 파일 기반 인증 핸들러, 즉 htpasswd 파일과 함께 BasicAuth를 사용합니다. 그러나 사용 가능한 모든 Apache 인증 기능을 사용할 수 있습니다.

아파치 기본인증

이 예에서는 Apache를 Grafana 앞에서 역방향 프록시로 사용합니다. Apache는 요청을 Grafana 백엔드 서비스로 전달하기 전에 사용자 인증을 처리합니다.

아파치 구성

    <VirtualHost *:80>
  ServerAdmin webmaster@authproxy
  ServerName authproxy
  ErrorLog "logs/authproxy-error_log"
  CustomLog "logs/authproxy-access_log" common
  
  <Proxy *>
  AuthType Basic
  AuthName GrafanaAuthProxy
  AuthBasicProvider file
  AuthUserFile /etc/apache2/grafana_htpasswd
  Require valid-user
  
  RewriteEngine On
  RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER},NS]
  RequestHeader set X-WEBAUTH-USER "%{PROXY_USER}e"
  </Proxy>
  
  RequestHeader unset Authorization
  
  ProxyRequests Off
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
  </VirtualHost>
  
세게 때리다
  • 가상 호스트 구성의 처음 네 줄은 표준이므로 이들이 하는 일에 대해서는 자세히 설명하지 않겠습니다.
  • 모든 프록시 요청에 인증 규칙을 적용하기 위해 <proxy> 구성 블록을 사용합니다. 이러한 규칙에는 user:password 자격 증명이 /etc/apache2/grafana_htpasswd 파일에 저장되는 기본 인증 요구가 포함됩니다. 이 파일은 htpasswd명령으로 생성할 수 있습니다.
    • 구성의 다음 부분은 까다로운 부분입니다. Apache의 재작성 엔진을 사용 하여 인증된 사용자로 채워진 X-WEBAUTH-USER 헤더 를 생성합니다.
      • RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER}, NS] : 이 줄은 약간의 마법입니다. 그것이 하는 일은 모든 요청에 ​​대해 rewriteEngines look-ahead(LA-U) 기능을 사용하여 요청을 처리한 후 REMOTE_USER 변수가 무엇으로 설정될지 결정하는 것입니다. 그런 다음 결과를 PROXY_USER 변수에 할당합니다. REMOTE_USER 변수를 RequestHeader 함수에 사용할 수 없기 때문에 이것은 필요합니다.
      • RequestHeader set X-WEBAUTH-USER "%{PROXY_USER}e" : 이제 인증된 사용자 이름이 PROXY_USER 변수에 저장되어 사용자 이름이 포함된 백엔드 Grafana로 전송될 새 HTTP 요청 헤더를 생성합니다.
  • RequestHeader unset Authorization HTTP 요청이 Grafana로 전달되기 전에 Authorization 헤더를 제거합니다. 이렇게 하면 Grafana가 이러한 자격 증명을 사용하여 사용자 인증을 시도하지 않습니다(BasicAuth는 Grafana에서 지원되는 인증 처리기입니다).
  • 마지막 3줄은 인증된 모든 요청을 포트 3000에서 실행되는 Grafana 서버로 보내는 표준 역방향 프록시 구성입니다.

Docker를 사용한 전체 연습.

이 예에서는 Docker Hub 에서 사용할 수 있는 공식 Grafana Docker 이미지를 사용합니다 .

  • grafana.ini다음 내용 으로 파일 생성
[users]
  allow_sign_up = false
  auto_assign_org = true
  auto_assign_org_role = Editor
  
  [auth.proxy]
  enabled = true
  header_name = X-WEBAUTH-USER
  header_property = username
  auto_sign_up = true
  
세게 때리다

사용자 지정 grafana.ini를 사용하여 Grafana 컨테이너를 시작합니다 /etc/grafana/grafana.ini. 이 컨테이너는 Apache 컨테이너로만 연결되므로 이 컨테이너에 대한 포트를 노출하지 않습니다.

docker run -i -v $(pwd)/grafana.ini:/etc/grafana/grafana.ini --name grafana grafana/grafana
  
세게 때리다

아파치 컨테이너

이 예에서는 Docker Hub 에서 사용할 수 있는 공식 Apache Docker 이미지를 사용합니다.

  • httpd.conf다음 내용 으로 파일 생성
ServerRoot "/usr/local/apache2"
  Listen 80
  LoadModule mpm_event_module modules/mod_mpm_event.so
  LoadModule authn_file_module modules/mod_authn_file.so
  LoadModule authn_core_module modules/mod_authn_core.so
  LoadModule authz_host_module modules/mod_authz_host.so
  LoadModule authz_user_module modules/mod_authz_user.so
  LoadModule authz_core_module modules/mod_authz_core.so
  LoadModule auth_basic_module modules/mod_auth_basic.so
  LoadModule log_config_module modules/mod_log_config.so
  LoadModule env_module modules/mod_env.so
  LoadModule headers_module modules/mod_headers.so
  LoadModule unixd_module modules/mod_unixd.so
  LoadModule rewrite_module modules/mod_rewrite.so
  LoadModule proxy_module modules/mod_proxy.so
  LoadModule proxy_http_module modules/mod_proxy_http.so
  <IfModule unixd_module>
  User daemon
  Group daemon
  </IfModule>
  ServerAdmin you@example.com
  <Directory />
  AllowOverride none
  Require all denied
  </Directory>
  DocumentRoot "/usr/local/apache2/htdocs"
  ErrorLog /proc/self/fd/2
  LogLevel error
  <IfModule log_config_module>
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  LogFormat "%h %l %u %t \"%r\" %>s %b" common
  <IfModule logio_module>
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
  </IfModule>
  CustomLog /proc/self/fd/1 common
  </IfModule>
  <Proxy *>
  AuthType Basic
  AuthName GrafanaAuthProxy
  AuthBasicProvider file
  AuthUserFile /tmp/htpasswd
  Require valid-user
  RewriteEngine On
  RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER},NS]
  RequestHeader set X-WEBAUTH-USER "%{PROXY_USER}e"
  </Proxy>
  RequestHeader unset Authorization
  ProxyRequests Off
  ProxyPass / http://grafana:3000/
  ProxyPassReverse / http://grafana:3000/
  
세게 때리다
  • htpasswd 파일을 생성합니다. 비밀번호 비밀번호 로 새 사용자 anthony 를 만듭니다.
  • htpasswd -bc htpasswd anthony password
        
    세게 때리다
  • 사용자 정의 httpd.conf 및 htpasswd 파일을 사용하여 httpd 컨테이너를 시작합니다. 컨테이너는 포트 80에서 수신 대기하고 이 컨테이너가 호스트 이름 grafana 를 Grafana 컨테이너의 IP 주소로 확인할 수 있도록 grafana 컨테이너 에 대한 링크를 생성합니다.
  • docker run -i -p 80:80 --link grafana:grafana -v $(pwd)/httpd.conf:/usr/local/apache2/conf/httpd.conf -v $(pwd)/htpasswd:/tmp/htpasswd httpd:2.4
        
    세게 때리다

그라파나를 사용합니다.

Grafana 및 Apache 컨테이너를 실행하면 이제 http://localhost/에 연결하고 htpasswd 파일에서 생성한 사용자 이름/암호를 사용하여 로그인할 수 있습니다.

팀 동기화(Enterprise만 해당)

Grafana Enterprise v6.3 이상에서만 사용 가능

Team Sync를 사용하면 인증 공급자와 Grafana의 팀 간에 동기화를 설정할 수 있습니다. HTTP 헤더의 일부로 Grafana 값을 보내고 Grafana가 이를 팀 구조에 매핑하도록 할 수 있습니다. 이를 통해 사용자를 특정 팀에 자동으로 배치할 수 있습니다.

이 기능을 지원하기 위해 인증 프록시는 선택적 헤더가 추가 사용자 속성을 매핑하도록 허용합니다. 팀 동기화를 지원하는 특정 속성은 Groups입니다.

# Optionally define more headers to sync other user attributes
  headers = "Groups:X-WEBAUTH-GROUPS"
  
세게 때리다

헤더를 사용하여 X-WEBAUTH-GROUPS각 사용자에 대한 팀 정보를 보냅니다. 특히, 사용자가 속한 Grafana의 그룹 ID 집합입니다.

먼저 인증 공급자와 Grafana 간의 매핑을 설정해야 합니다. Grafana 내에서 팀에 그룹을 추가하려면 다음 지침 을 따르십시오 .

일단 완료되었습니다. API를 쿼리하여 매핑을 확인할 수 있습니다.

# First, inspect your teams and obtain the corresponding ID of the team we want to inspect the groups for.
  curl -H "X-WEBAUTH-USER: admin" http://localhost:3000/api/teams/search
  {
  "totalCount": 2,
  "teams": [
  {
  "id": 1,
  "orgId": 1,
  "name": "Core",
  "email": "core@grafana.com",
  "avatarUrl": "/avatar/327a5353552d2dc3966e2e646908f540",
  "memberCount": 1,
  "permission": 0
  },
  {
  "id": 2,
  "orgId": 1,
  "name": "Loki",
  "email": "loki@grafana.com",
  "avatarUrl": "/avatar/102f937d5344d33fdb37b65d430f36ef",
  "memberCount": 0,
  "permission": 0
  }
  ],
  "page": 1,
  "perPage": 1000
  }
  
  # Then, query the groups for that particular team. In our case, the Loki team which has an ID of "2".
  curl -H "X-WEBAUTH-USER: admin" http://localhost:3000/api/teams/2/groups
  [
  {
  "orgId": 1,
  "teamId": 2,
  "groupId": "lokiTeamOnExternalSystem"
  }
  ]
  
세게 때리다

마지막으로 Grafana가 헤더가 인 요청을 수신할 때마다 X-WEBAUTH-GROUPS: lokiTeamOnExternalSystem인증 중인 사용자가 지정된 팀에 배치됩니다. 여러 팀에 배치하는 것은 예를 들어 쉼표로 구분된 값을 사용하여 지원됩니다 lokiTeamOnExternalSystem,CoreTeamOnExternalSystem.

curl -H "X-WEBAUTH-USER: leonard" -H "X-WEBAUTH-GROUPS: lokiteamOnExternalSystem" http://localhost:3000/dashboards/home
  {
  "meta": {
  "isHome": true,
  "canSave": false,
  ...
  }
  
세게 때리다

이를 통해 사용자 leonard는 Grafana 인증의 일부로 자동으로 Loki 팀에 배치됩니다.

팀 동기화에 대해 자세히 알아보기

Grafana로 enable_login_token설정 하면 true성공적인 인증 프록시 헤더 유효성 검사 후 사용자에게 로그인 토큰과 쿠키를 할당합니다. /login 경로에 대한 헤더를 제공하도록 인증 프록시를 구성하기만 하면 됩니다. 다른 경로를 통한 요청은 쿠키를 사용하여 인증됩니다.

설정 login_maximum_inactive_lifetime_days및 login_maximum_lifetime_daysunder [auth]를 사용하여 세션 수명을 제어합니다. 로그인 토큰에 대해 자세히 알아보기

'그라파나' 카테고리의 다른 글

LDAP 인증  (0) 2022.07.13
JWT 인증  (0) 2022.07.13
그라파나 인증  (0) 2022.07.13
사용자 인증 개요  (0) 2022.07.12
대시보드 관리 성숙도 모델  (0) 2022.07.12