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.

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.
# 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:createCredentials dosya yapısı esnektir ve iç içe anahtarları destekler:
# 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:
# 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) || falseServis yapılandırmasında pratik kullanım:
# 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:
# Ü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 productionProjedeki dosya yapısı:
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ı:
# Anahtarları asla commit etmeyin!
config/master.key
config/credentials/*.key
# İsteğe bağlı: yerel geçersiz kılmalar
config/credentials/local.yml.encGelişmiş Veritabanı Yapılandırması
Credentials ile veritabanı yapılandırması entegrasyonu:
# 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ı:
# config/credentials/production.yml.enc
database:
host: prod-db.example.com
name: myapp_production
username: myapp_user
password: extremely_secure_password_2026
port: 5432Anahtar Rotasyonu ve Gizli Bilgi Taşıma
Düzenli anahtar rotasyonu temel bir güvenlik uygulamasıdır:
# 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
endCI/CD Entegrasyonu
Popüler CI/CD platformları için yapılandırma:
# .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/deployDocker için yapılandırma:
# 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"]# 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ı:
# 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
endYaygın sorunlar ve çözümler:
# 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
endGüvenlik En İyi Uygulamaları
Gizli bilgi yönetimi için temel ilkeler:
# 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?
endDoğrulayıcı sınıf:
# 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
endRuby 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

2026'da Rails Turbo ve Hotwire: Gerçek Zamanlı Uygulamalar ve Mülakat Soruları
Rails geliştiricileri için Turbo 8 ve Hotwire hakkında kapsamlı bir rehber. Mimari, morphing, Turbo Streams, production kalıpları ve teknik mülakat soruları.

2026'da Rails API Modu: RESTful API, Serializasyon ve Mulakat Sorulari
Rails API-only modu ile production-ready RESTful API gelistirme: Alba ve jsonapi-serializer ile JSON serializasyonu, JWT authentication, hata yonetimi ve RSpec testleri.

Rails 8'de Solid Queue ve Solid Cache: 2026 Teknik Mülakat Hazırlık Rehberi
Solid Queue ve Solid Cache, Rails 8'de Redis bağımlılığını ortadan kaldırıyor. Mimari yapı, yapılandırma, eşzamanlılık kontrolleri ve 2026 teknik mülakat soruları hakkında kapsamlı rehber.