2026'da Rails Credentials ve Secrets: Güvenli Ortam Değişkenleri Yönetimi

Ruby on Rails 2026'da gizli bilgi yönetimi için kapsamlı rehber. Rails credentials, şifrelenmiş dosyalar ve en iyi güvenlik uygulamalarını keşfedin.

2026'da Rails Credentials ve Secrets: Güvenli Ortam Değişkenleri Yönetimi

Web uygulamalarının güvenliği, hassas verilerin doğru yönetimi ile başlar. Ruby on Rails, API anahtarlarını, veritabanı parolalarını ve diğer gizli bilgileri şifrelenmiş biçimde doğrudan kod deposunda saklayabilen gelişmiş bir credentials sistemi sunar. 2026 yılında bu sistem olgunluğa ulaşarak üst düzey esneklik ve güvenlik sağlamaktadır.

Bu rehber, Rails'te gizli bilgi yönetimine temel yapılandırmadan üretim ortamlarındaki ileri düzey dağıtım senaryolarına kadar kapsamlı bir yaklaşım sunmaktadır.

Rails 8, farklı ortamlar için birden fazla credentials dosyası desteğini geliştirmiştir. Yapılandırma ölçeklendirme sorunlarından kaçınmak için bu özelliği projenin başından itibaren kullanmak önerilmektedir.

Rails Credentials Temelleri

Rails'teki credentials sistemi, gizli bilgileri şifrelenmiş config/credentials.yml.enc dosyasında saklar. Şifre çözme işlemi için depo dışında tutulması gereken master key gereklidir.

bash
# Credentials düzenleme (varsayılan editörü açar)
RAILS_EDITOR="code --wait" bin/rails credentials:edit

# Mevcut credentials'ı görüntüleme
bin/rails credentials:show

# Yeni master key oluşturma
bin/rails credentials:create

Credentials dosya yapısı esnektir ve iç içe anahtarları destekler:

yaml
# config/credentials.yml.enc (şifre çözüldükten sonra)
aws:
  access_key_id: AKIAIOSFODNN7EXAMPLE
  secret_access_key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  region: eu-central-1

database:
  password: super_secret_db_password_2026

redis:
  url: redis://user:password@redis-host:6379/0

stripe:
  publishable_key: pk_live_xxxxxxxxxxxxx
  secret_key: sk_live_xxxxxxxxxxxxx
  webhook_secret: whsec_xxxxxxxxxxxxx

secret_key_base: a1b2c3d4e5f6g7h8i9j0...

Uygulamada Credentials Erişimi

Rails, şifrelenmiş değerleri okumak için basit bir arayüz sağlar:

ruby
# Tek değere erişim
Rails.application.credentials.secret_key_base

# İç içe değerlere erişim
Rails.application.credentials.aws[:access_key_id]
Rails.application.credentials.dig(:aws, :access_key_id)

# Varsayılan değerle güvenli erişim
Rails.application.credentials.dig(:feature_flags, :new_ui) || false

Servis yapılandırmasında pratik kullanım:

ruby
# config/initializers/aws.rb
Aws.config.update(
  region: Rails.application.credentials.dig(:aws, :region),
  credentials: Aws::Credentials.new(
    Rails.application.credentials.dig(:aws, :access_key_id),
    Rails.application.credentials.dig(:aws, :secret_access_key)
  )
)

# config/initializers/stripe.rb
Stripe.api_key = Rails.application.credentials.dig(:stripe, :secret_key)

Farklı Ortamlar İçin Credentials

Rails, her ortam için ayrı credentials dosyalarını destekler. Bu, üretim projeleri için kritik bir özelliktir:

bash
# Üretim ortamı için credentials oluşturma
RAILS_EDITOR="code --wait" bin/rails credentials:edit --environment production

# Staging ortamı için credentials oluşturma
RAILS_EDITOR="code --wait" bin/rails credentials:edit --environment staging

# Belirli ortam için credentials görüntüleme
bin/rails credentials:show --environment production

Projedeki dosya yapısı:

text
config/
├── credentials.yml.enc           # Varsayılan (development/test)
├── credentials/
│   ├── production.yml.enc        # Üretim
│   ├── production.key            # Üretim anahtarı (commit etmeyin!)
│   ├── staging.yml.enc           # Staging
│   └── staging.key               # Staging anahtarı (commit etmeyin!)
├── master.key                    # Varsayılan anahtar (commit etmeyin!)

Güvenlik için .gitignore yapılandırması:

gitignore
# Anahtarları asla commit etmeyin!
config/master.key
config/credentials/*.key

# İsteğe bağlı: yerel geçersiz kılmalar
config/credentials/local.yml.enc

Gelişmiş Veritabanı Yapılandırması

Credentials ile veritabanı yapılandırması entegrasyonu:

yaml
# config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

production:
  <<: *default
  host: <%= Rails.application.credentials.dig(:database, :host) %>
  database: <%= Rails.application.credentials.dig(:database, :name) %>
  username: <%= Rails.application.credentials.dig(:database, :username) %>
  password: <%= Rails.application.credentials.dig(:database, :password) %>
  port: <%= Rails.application.credentials.dig(:database, :port) || 5432 %>

Credentials'taki karşılık gelen yapı:

yaml
# config/credentials/production.yml.enc
database:
  host: prod-db.example.com
  name: myapp_production
  username: myapp_user
  password: extremely_secure_password_2026
  port: 5432

Anahtar Rotasyonu ve Gizli Bilgi Taşıma

Düzenli anahtar rotasyonu temel bir güvenlik uygulamasıdır:

ruby
# lib/tasks/credentials.rake
namespace :credentials do
  desc "Rotate master key and re-encrypt credentials"
  task rotate: :environment do
    require 'rails/application'
    require 'rails/secrets'

    # Mevcut credentials'ı okuma
    current_credentials = Rails.application.credentials.config

    # Yeni anahtar oluşturma
    new_key = ActiveSupport::EncryptedConfiguration.generate_key

    # Yeni anahtarı kaydetme
    new_key_path = Rails.root.join('config', 'master.key.new')
    File.write(new_key_path, new_key)

    puts "New master key generated: #{new_key_path}"
    puts "Remember to:"
    puts "1. Re-encrypt credentials with new key"
    puts "2. Update key in deployment environment"
    puts "3. Remove old key after verification"
  end

  desc "Validate credentials structure"
  task validate: :environment do
    required_keys = [
      [:secret_key_base],
      [:database, :password],
      [:aws, :access_key_id],
      [:aws, :secret_access_key]
    ]

    missing = required_keys.reject do |key_path|
      Rails.application.credentials.dig(*key_path).present?
    end

    if missing.any?
      puts "Missing credentials:"
      missing.each { |k| puts "  - #{k.join('.')}" }
      exit 1
    else
      puts "All required credentials present."
    end
  end
end

CI/CD Entegrasyonu

Popüler CI/CD platformları için yapılandırma:

yaml
# .github/workflows/deploy.yml
name: Deploy to Production

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.3'
          bundler-cache: true

      - name: Decrypt credentials
        env:
          RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
        run: |
          bin/rails credentials:show --environment production > /dev/null
          echo "Credentials decrypted successfully"

      - name: Run tests
        env:
          RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
          RAILS_ENV: test
        run: bin/rails test

      - name: Deploy
        env:
          RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
        run: ./bin/deploy

Docker için yapılandırma:

dockerfile
# Dockerfile
FROM ruby:3.3-slim

WORKDIR /app

# Bağımlılıkları yükleme
COPY Gemfile Gemfile.lock ./
RUN bundle install --without development test

# Uygulamayı kopyalama
COPY . .

# Asset ön derleme (RAILS_MASTER_KEY gerektirir)
ARG RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY=$RAILS_MASTER_KEY
RUN bundle exec rails assets:precompile

# Başlatma
CMD ["bin/rails", "server", "-b", "0.0.0.0"]
yaml
# docker-compose.yml
services:
  web:
    build:
      context: .
      args:
        RAILS_MASTER_KEY: ${RAILS_MASTER_KEY}
    environment:
      - RAILS_MASTER_KEY=${RAILS_MASTER_KEY}
      - RAILS_ENV=production
    ports:
      - "3000:3000"

Hata Ayıklama ve Sorun Giderme

Credentials için tanılama araçları:

ruby
# lib/tasks/debug_credentials.rake
namespace :debug do
  desc "Check credentials configuration"
  task credentials: :environment do
    puts "Environment: #{Rails.env}"
    puts "Master key present: #{ENV['RAILS_MASTER_KEY'].present? || File.exist?(Rails.root.join('config', 'master.key'))}"

    begin
      creds = Rails.application.credentials.config
      puts "Credentials loaded: YES"
      puts "Top-level keys: #{creds.keys.join(', ')}"
    rescue => e
      puts "Credentials error: #{e.message}"
    end
  end
end

Yaygın sorunlar ve çözümler:

ruby
# config/application.rb
module MyApp
  class Application < Rails::Application
    # Gerekli credentials eksikse hata zorla
    config.after_initialize do
      if Rails.env.production?
        required = %i[secret_key_base]
        missing = required.select { |key| credentials.send(key).blank? }

        if missing.any?
          raise "Missing required credentials: #{missing.join(', ')}"
        end
      end
    end
  end
end

Güvenlik En İyi Uygulamaları

Gizli bilgi yönetimi için temel ilkeler:

ruby
# config/initializers/security.rb
Rails.application.configure do
  # Üretimde şifreli bağlantı zorla
  config.force_ssl = true if Rails.env.production?

  # Ayrıntılı hataları devre dışı bırak
  config.consider_all_requests_local = false if Rails.env.production?
end

# Uygulama başlangıcında credentials doğrulama
Rails.application.config.after_initialize do
  validator = CredentialsValidator.new(Rails.application.credentials)
  validator.validate! if Rails.env.production?
end

Doğrulayıcı sınıf:

ruby
# app/services/credentials_validator.rb
class CredentialsValidator
  REQUIRED_KEYS = {
    production: [
      [:secret_key_base],
      [:database, :password],
      [:aws, :access_key_id],
      [:aws, :secret_access_key],
      [:stripe, :secret_key]
    ],
    staging: [
      [:secret_key_base],
      [:database, :password]
    ]
  }.freeze

  def initialize(credentials)
    @credentials = credentials
  end

  def validate!
    env = Rails.env.to_sym
    required = REQUIRED_KEYS[env] || []

    missing = required.reject do |key_path|
      @credentials.dig(*key_path).present?
    end

    raise MissingCredentialsError, missing if missing.any?

    true
  end

  class MissingCredentialsError < StandardError
    def initialize(keys)
      super("Missing credentials: #{keys.map { |k| k.join('.') }.join(', ')}")
    end
  end
end

Ruby on Rails mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Sonuç

2026'da Rails credentials sistemi, uygulama gizli bilgilerini yönetmek için eksiksiz bir çözüm sunmaktadır. Şifrelenmiş credentials dosyaları güvenle depoda saklanabilirken, master key güvenli dağıtım ortamında kalır.

Etkili gizli bilgi yönetiminin temel unsurları şunları içerir: ortamlara göre credentials ayrımı, düzenli anahtar rotasyonu, uygulama başlangıcında doğrulama ve CI/CD pipeline ile uygun entegrasyon. Bu uygulamalara bağlı kalmak, uygulama yaşam döngüsü boyunca hassas verilerin güvenliğini sağlar.

Rails credentials, çoğu senaryoda harici gizli bilgi yönetim araçlarına olan ihtiyacı ortadan kaldırırken, Ruby on Rails ekosistemine özgü yapılandırma basitliğini korur.

Paylaş

İlgili makaleler