엔지니어에게 데이터베이스 액세스 권한을 제공하는 방법

DEV를 비롯한 많은 회사들이 자주 직면하는 공통된 문제는 엔지니어가 얼마나 많은 데이터를 접근할 수 있느냐는 것이다.엔지니어의 생산 데이터 접근을 허용하는 것은 많은 장점이 있다.그것은 그들이 프로젝트를 진행할 때 더욱 현명한 결정을 내릴 수 있도록 도와줄 수 있다. 왜냐하면 그들은 사용할 데이터에 대해 명확한 이해를 가지고 있기 때문이다.디버깅 생산 코드가 중단되고 엔지니어가 원인을 찾아야 하는 상황에서도 유용하다.
다른 한편, 엔지니어가 생산 데이터에 접근할 수 있도록 허용하는 것도 위험이다.엔지니어가 데이터베이스에서 그들이 변경하지 말아야 할 내용을 의외로 바꾸는 것을 원하지 않는다. 엔지니어가 보지 말아야 할 민감한 고객 데이터도 데이터베이스에 있을 수 있다.우리는 DEV에서 이 문제를 만났고 우리가 매우 만족하는 해결 방안을 찾았습니다. 여러분과 공유하고 싶습니다.

안녕, 블레이저.


우선, 우리는 데이터베이스 접근 문제를 해결했다.우리는 어떻게 엔지니어로 하여금 데이터베이스와 그 모든 정보를 방문하게 합니까?일부 회사는 엔지니어가 생산 컨트롤러에 접근하는 것을 허락한다.이것은 우리에게 옵션이 아니다. 왜냐하면 우리는 Heroku를 사용하기 때문이다. 단지 몇 명의 고급 엔지니어만이 완전한 Heroku 접근 권한을 가지고 있기 때문이다. 이것은 컨트롤러를 시작하는 데 필요한 것이다.
콘솔 접근 기능이 생겨서 우리는 다른 방법을 찾기 시작했다.그때 우리는 앤드류 케인이 쓴 것을 찾았다Blazer gem.Blazer를 설치한 후 사용자는 다음과 같은 웹 UI를 통해 데이터베이스를 조회할 수 있습니다.

Blazer는 사용자가 데이터베이스를 조회할 수 있도록 하는 것 외에도 다음과 같은 다양한 기능을 제공합니다.
  • 나중에 다시 사용하기 위해 조회를 저장합니다
  • 실행 중인 모든 쿼리를 선택적으로 추적
  • 귀하의 조회
  • 에 따라 charts
  • 다른 사람과 합작datasources

  • Smart VariablesSmart Columns

  • 이것이 바로 우리가 원하는 것이기 때문에 우리는 창업판 홈페이지에서 개술한 절차에 따라 계속 진행한다.
    몇 가지 주의해야 할 일이 있다.우선, 우리는 데이터 프라이버시와 읽기 전용 접근 문제를 해결해야 하기 때문에 super_admins Blazer에 접근할 수 있습니다.
    authenticate :user, ->(user) { user.has_role?(:super_admin) } do
      mount Blazer::Engine, at: "blazer"
    end
    

    개발 설정


    Blazer는 ENV 변수BLAZER_DATABASE_URL를 사용하여 데이터베이스를 보는 위치를 알 수 있습니다.개발 과정에서 BLAZER_DATABASE_URL가 0이면 Blazer는ActiveRecord 연결을 사용하여 데이터베이스와 통신하는 것을 발견했다.이것은 그것의 건립과 개발을 매우 쉽게 만들었다.

    프로덕션 설정

    BLAZER_DATABASE_URL 별도의 사용자를 사용하여 데이터베이스와 대화할 수 있도록 Blazer를 설정할 수도 있습니다.Blazer를 통해 엔지니어가 실수로 운영 데이터를 변경하는 것을 방지하고자 합니다.Blazer의 자술에 따르면:

    Blazer tries to protect against queries that modify data (by running each query in a transaction and rolling it back), but a safer approach is to use a read-only user.


    Blazer가 트랜잭션을 사용하는 경우에도 읽기 전용 사용자를 통해 트랜잭션을 사용하는 것이 좋습니다.기본 ActiveRecord 연결에서 별도의 URL을 사용하면 URL에서 읽기 전용 사용자 자격 증명을 사용하여 데이터가 변경되지 않도록 할 수 있습니다.
    ENV["BLAZER_DATABASE_URL"] = "postgres://read-only-user:read-only-user-password@hostname:5432/database-name"
    

    읽기 전용 사용자 설정


    Blazer는 사용자가 지정한 데이터베이스docs on how to set up a read-only user까지 제공합니다.Postgres와 Heroku를 사용하기 때문에, 저는 Heroku Postgres 플러그인을 통해 읽기 전용 사용자를 만들었습니다. steps outlined in Heroku's Postgres guide

    새 사용자가 생기면 사용자 이름, 비밀번호, 데이터베이스 이름을 사용하고 BLAZER_DATABASE_URL 를 만들어야 합니다.BLAZER_DATABASE_URL 컬렉션으로 운영 데이터베이스를 조회하는 데 사용되는 UI가 생겼으며 데이터베이스가 보호되어 어떠한 방식으로도 변경되지 않습니다.유일하게 해야 할 일은 데이터를 필터하는 것이다.

    Hypershield 입장



    아니, 그런 방패가 아니야!우리가 찾고 있는 보호 덮개는 민감한 사용자 데이터를 숨길 수 있다.이를 실현하기 위해 우리는 다시 한 번 앤드류 케인의 또 다른 진품Hypershield에 도움을 청했다.작동 방식:

    Hypershield creates shielded views (in the hypershield schema by default) that hide sensitive tables and columns. The advantage of this approach over column-level privileges is you can use SELECT *.


    이 점을 실현하는 첫 번째 단계는 우리가 차단하고 싶은 열 목록을 만드는 것이다.우리는 생산 과정에서만 작동하기를 원하기 때문에, 우리 생산팀에 gm를 설치했다.
    group :production do
      gem "hypershield", "~> 0.2.0" # Allow admins to query data via internal
      gem "nakayoshi_fork", "~> 0.0.4" # solves CoW friendly problem on MRI 2.2 and later
      gem "rack-host-redirect", "~> 1.3" # Lean and simple host redirection via Rack middleware
    end
    
    다음에, 우리는 hypershield.rb 초기 값 설정 항목 파일에 차단할 열 목록을 만들었습니다.
    if Rails.env.production?
      Hypershield.enabled = ENV["ENABLE_HYPERSHIELD"].present?
    
      # Validate that hypershield schema exists before trying to use it
      begin
        if ActiveRecord::Base.connection.schema_exists?("hypershield")
          # Specify the schema to use and columns to show and hide
          Hypershield.schemas = {
            hypershield: {
              # columns to hide
              # matches table.column
              hide: %w[
                auth_data_dump
                email
                encrypted
                encrypted_password
                message_html
                message_markdown
                password
                previous_refresh_token
                refresh_token
                secret
                token
                current_sign_in_ip
                last_sign_in_ip
                reset_password_token
                remember_token
                unconfirmed_email
              ]
            }
          }
    
          # Log SQL statements
          Hypershield.log_sql = false
        end
      rescue ActiveRecord::NoDatabaseError
        Rails.logger.error("Hypershield initializer failed to check schema due to NoDatabaseError")
      end
    end
    
    Hypershield를 설정하기 전에 두 개의 추가 줄이 다른 검사를 실행하고 있음을 알 수 있습니다.우선, 우리는 다음과 같은 것이 있다.
    Hypershield.enabled = ENV["ENABLE_HYPERSHIELD"].present?
    
    이 행은 Hypershield 모드 refresh task를 비활성화하고 ENV 변수ENABLE_HYPERSHIELD가 없으면 마이그레이션을 실행할 때 발생합니다.
    다음은 다음과 같습니다.
    if ActiveRecord::Base.connection.schema_exists?("hypershield")
    
    이것은 hypershield 모드가 존재하지 않으면 설정하려고 시도하지 않고 오류가 발생하지 않도록 합니다.이 두 줄의 코드는 매우 중요하다. DEV 응용 프로그램 원본 코드를 사용하는 다른 지역사회도 있기 때문에, 우리가 응용 프로그램에 추가한 부족한, 완전히 선택할 수 있는 기능 때문에 중단되는 것을 원하지 않는다.

    생성 모드


    gem와 초기 값이 설정된 항목이 자리를 잡으면, 다음에hypershield 모드를 만들어야 합니다.우리는 대학원에서 일하기 때문에, 다음은 우리가 그것을 세우기 위해 채택한 절차이다.이러한 설정 절차와 기타 데이터베이스 유형의 설정 절차는 gem's README에 기록되어 있다.
    데이터베이스에 새 모델 만들기
    CREATE SCHEMA hypershield;
    
    Blazer를 사용하여 설치한 사용자에게 권한을 부여합니다.우리의 예에서, 우리는 이 모든 특권을 Heroku를 통해 설정한 읽기 전용 Blazer 사용자에게 부여하기를 희망합니다.
    GRANT USAGE ON SCHEMA hypershield TO readonly-blazer-username;
    
    -- replace migrations with the user who manages your schema
    ALTER DEFAULT PRIVILEGES FOR ROLE heroku-default-user IN SCHEMA hypershield
        GRANT SELECT ON TABLES TO readonly-blazer-username;
    
    -- keep public in search path for functions
    ALTER ROLE readonly-blazer-username SET search_path TO hypershield, public;
    
    Heroku를 사용하는 경우 Rails 콘솔에서 명령을 실행할 수 있습니다.
    sql = <<-SQL
      CREATE SCHEMA hypershield;
    SQL
    ActiveRecord::Base.connection.execute(sql)
    
    또는 이전에 설정한 Blazer 사용자 자격 증명을 사용하여 Heroku CLI를 통해 Postgres에 직접 연결할 수 있습니다.
    heroku pg:psql postgres-app-name --credential readonly-blazer-username --app your-app-name
    
    마지막 ALTER ROLE 문은 읽기 전용 Blazer 사용자가 실행해야 하므로 Heroku CLI 및 사용자 자격 증명을 사용해야 할 수 있습니다.또 다른 작은 문제는 Blazer 사용자만 읽도록 설정할 때 공공 모드에 완전히 접근할 수 있다는 것이다.이 명령을 취소하려면 아래 명령을 사용하십시오.이를 통해 Blazer 사용자는 Hypershield gem 설정의 실드 뷰만 볼 수 있습니다.
    REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM readonly-blazer-username;
    

    요컨대



    Blazer만 읽는 사용자가 차단 모드를 사용한 후, Blazer에서 모든 것이 예상대로 작동하는지 테스트할 때가 되었다.간단한 방법은 선택한 테이블 실행 SELECT * 을 조회하는 것입니다.우리의 예에서 나는 메시지로 그것을 테스트했다.

    예상한 바와 같이 메시지 텍스트나 본문 필드가 존재하지 않습니다.다른 테스트 방법은 테이블에서 차단된 필드를 요청하는 것이다.이 예에서, 메시지에서 현식 요청 message_html 을 시도했습니다. 오류가 발생했습니다.

    모든 테스트가 만족스러울 때 가장 할 필요가 없는 것은 Blazer를 사용하고 싶은 사람들에게 노출시키는 것이다.DEV에서는 Blazer 콘솔에 액세스하는 옵션(기본적으로 엔지니어)을 선택했습니다.
    authenticate :user, ->(user) { user.has_role?(:tech_admin) } do
      mount Blazer::Engine, at: "blazer"
    end
    

    완성!


    이렇게 하면 너는 끝장이야!지금 앉아서 당신의 개발 동료들의 칭찬을 기다리세요. 그들은 지금 그들이 절실하게 필요로 하는 데이터를 방문할 수 있습니다.

    좋은 웹페이지 즐겨찾기