Güvenlik açısından bakıldığında, kullanılmayan oturumların açık kalması ciddi bir risk oluşturur. Birisi sunucuya SSH ile bağlanır, bir şeyler yapar ve terminali kapatmadan uzaklaşır ya da masaüstünde oturum açık kalır. İşte o an, potansiyel bir güvenlik açığı doğmuş demektir. Otomatik oturum zaman aşımı yapılandırması, bu probleme karşı en pratik ve etkili önlemlerden biridir. Bu yazıda, Linux sistemlerinde otomatik çıkış mekanizmalarını nasıl kuracağınızı, hangi yöntemlerin hangi senaryolarda işe yaradığını ve kurumsal ortamlarda nasıl uygulayacağınızı detaylıca ele alacağız.
Oturum Zaman Aşımı Neden Önemli?
Şöyle bir senaryo düşünün: Geliştirici Ahmet, production sunucusuna root olarak bağlanır. Acil bir toplantıya girmek zorunda kalır ve terminali minimize ederek gider. İki saat sonra döndüğünde oturum hala açıktır. Bu süre zarfında başka biri bilgisayarın başına geçmiş olabilir, ya da daha kötüsü, o makine kurumsal ağda bir jump server rolü görüyorsa ciddi bir güvenlik açığı söz konusudur.
PCI-DSS, ISO 27001, HIPAA gibi uyumluluk standartları oturum zaman aşımını zorunlu kılar. Bu sadece “iyi bir alışkanlık” değil, çoğu kurumsal ortamda yasal bir gereklilik haline gelmiştir.
Otomatik çıkış yapılandırmasının faydaları:
- Yetkisiz erişimi engelleme: Fiziksel erişim saldırılarına karşı koruma sağlar
- Kaynak tasarrufu: Zombie oturumlar sistem kaynaklarını tüketir
- Uyumluluk: Denetim gereksinimlerini karşılar
- Güvenlik politikası uygulaması: Kullanıcıları belirli bir disipline alıştırır
TMOUT Değişkeni ile Bash Oturum Zaman Aşımı
En temel ve yaygın yöntem, bash kabuğunun yerleşik TMOUT değişkenini kullanmaktır. Bu değişken saniye cinsinden bir değer alır ve belirtilen süre boyunca hiçbir girdi alınmazsa oturumu otomatik olarak kapatır.
Kullanıcı Bazında Yapılandırma
Belirli bir kullanıcı için zaman aşımı ayarlamak istiyorsanız, o kullanıcının ~/.bashrc veya ~/.bash_profile dosyasına ekleme yapabilirsiniz:
# ~/.bashrc dosyasına ekleyin
echo 'TMOUT=300' >> ~/.bashrc
echo 'export TMOUT' >> ~/.bashrc
source ~/.bashrc
Bu örnekte 300 saniye, yani 5 dakika sonra oturum kapanacaktır. Değeri değiştirmek için saniye hesabını buna göre yapın: 1800 = 30 dakika, 3600 = 1 saat.
Sistem Genelinde Yapılandırma
Tüm kullanıcılara uygulamak için /etc/profile veya /etc/profile.d/ dizini altında bir dosya oluşturmanız daha temiz bir yaklaşımdır:
# /etc/profile.d/autologout.sh dosyasını oluşturun
cat > /etc/profile.d/autologout.sh << 'EOF'
# Oturum zaman asimi: 15 dakika
TMOUT=900
readonly TMOUT
export TMOUT
EOF
chmod +x /etc/profile.d/autologout.sh
Burada dikkat edilmesi gereken nokta readonly kullanımıdır. Bu sayede kullanıcılar TMOUT değerini kendi oturumlarında değiştiremezler. Güvenlik politikasının delinmesini önlemek için bu çok önemlidir.
TMOUT’un Sınırlılıkları
TMOUT sadece interaktif bash oturumlarında çalışır. Çalışan scriptler veya background process’ler bu değeri etkilemez. Ayrıca kullanıcı readonly ayarını atlatmak için unset TMOUT diyebilir… Ama readonly ile işaretlenmişse bu da çalışmaz. Yine de bash yerine sh veya başka bir shell kullananlar için bu yöntem işe yaramaz.
SSH Seviyesinde Zaman Aşımı Yapılandırması
SSH oturumları için ayrı bir yapılandırma gereklidir. /etc/ssh/sshd_config dosyasındaki parametreler hem sunucu hem de istemci tarafında ayarlanabilir.
Sunucu Tarafı SSH Yapılandırması
# /etc/ssh/sshd_config dosyasını düzenleyin
sudo nano /etc/ssh/sshd_config
Aşağıdaki parametreleri ekleyin veya düzenleyin:
# Her 60 saniyede bir keepalive mesaji gonder
ClientAliveInterval 60
# 15 kez yanit alinamazsa baglantıyi kes (15 * 60 = 900 saniye = 15 dakika)
ClientAliveCountMax 15
# Kimlik dogrulama icin maksimum sure (saniye)
LoginGraceTime 60
# Bos parolali girislere izin verme
PermitEmptyPasswords no
ClientAliveInterval: SSH sunucusu, bu süre (saniye) kadar aktivite olmadığında istemciye bir mesaj gönderir.
ClientAliveCountMax: Yanıtsız kalan mesaj sayısı bu değeri aşarsa bağlantı kesilir. Efektif timeout süresi ClientAliveInterval * ClientAliveCountMax formülüyle hesaplanır.
LoginGraceTime: Kullanıcının bağlandıktan sonra kimlik doğrulamasını tamamlaması için verilen süre.
Değişiklikleri uygulamak için SSH servisini yeniden başlatın:
sudo systemctl restart sshd
# Yapılandırmayı test etmek için
sudo sshd -t && echo "Konfigürasyon gecerli"
İstemci Tarafı SSH Yapılandırması
Bağlantıyı kuran tarafta da ayar yapılabilir. /etc/ssh/ssh_config (sistem geneli) veya ~/.ssh/config (kullanıcı bazlı):
cat >> ~/.ssh/config << 'EOF'
Host *
ServerAliveInterval 60
ServerAliveCountMax 10
EOF
PAM ile Oturum Yönetimi
PAM (Pluggable Authentication Modules), oturum yönetimi için daha güçlü kontroller sunar. pam_limits modülü ile çeşitli kaynak kısıtlamaları uygulanabilir, ancak doğrudan zaman aşımı için pam_time veya özel scriptler kullanmak gerekir.
Daha pratik bir yaklaşım, pam_exec ile özel bir timeout scripti çalıştırmaktır. Ancak günlük kullanımda en yaygın PAM tabanlı çözüm, /etc/security/limits.conf üzerinden maxlogins gibi parametreleri ayarlamaktır:
# /etc/security/limits.conf
# Kullanici basi maksimum oturum sayisi
@developers hard maxlogins 3
root hard maxlogins 2
Bu doğrudan timeout değil ama oturum sayısını sınırlayarak riski azaltır.
systemd ile Oturum Timeout Yönetimi
Modern Linux sistemlerinde systemd-logind oturum yönetimini üstlenir. loginctl komutuyla aktif oturumları izleyebilir ve systemd üzerinden politikalar uygulayabilirsiniz.
# Aktif oturumlari listele
loginctl list-sessions
# Belirli bir oturumun detaylarini goster
loginctl show-session SESSION_ID
# Oturumu zorla sonlandır
loginctl terminate-session SESSION_ID
# Tüm kullanici oturumlarini kapat
loginctl terminate-user kullanici_adi
/etc/systemd/logind.conf dosyasında bazı oturum parametreleri ayarlanabilir:
sudo nano /etc/systemd/logind.conf
[Login]
# Idle durumundaki oturumlar icin action
IdleAction=lock
IdleActionSec=10min
# Güç dugmesine basilinca
HandlePowerKey=poweroff
# Kapak kapaninca (laptop'lar icin)
HandleLidSwitch=suspend
Değişiklikten sonra servisi yeniden başlatın:
sudo systemctl restart systemd-logind
Gerçek Dünya Senaryosu: Kurumsal SSH Bastion Sunucusu
Bir finans şirketinde jump server olarak kullanılan bir bastion host için kapsamlı bir konfigürasyon örneği verelim. Bu senaryoda tüm sistem yöneticileri bu sunucu üzerinden iç ağa bağlanıyor ve 10 dakikadan fazla hareketsizlik kesinlikle tolere edilmiyor.
#!/bin/bash
# /opt/scripts/session-policy.sh
# Bastion host oturum guvenlik politikasi
# Zaman asimi: 10 dakika (600 saniye)
TMOUT=600
readonly TMOUT
export TMOUT
# Uyari mesaji goster
echo "============================================"
echo "UYARI: Bu sistem izlenmektedir."
echo "10 dakika hareketsizlik sonunda oturum"
echo "otomatik olarak kapatilacaktir."
echo "============================================"
# Son giris bilgisini goster
last -1 $USER | head -1
Bu scripti tüm kullanıcılara uygulamak için:
# Scripti yerlesik konuma koy
sudo cp /opt/scripts/session-policy.sh /etc/profile.d/session-policy.sh
sudo chmod 644 /etc/profile.d/session-policy.sh
# sshd_config'i da guncelle
sudo tee -a /etc/ssh/sshd_config << 'EOF'
# Bastion host guvenlik ayarlari
ClientAliveInterval 60
ClientAliveCountMax 10
LoginGraceTime 30
MaxSessions 10
Banner /etc/ssh/banner.txt
EOF
sudo systemctl restart sshd
Screen ve Tmux Oturumları için Özel Yaklaşım
screen veya tmux kullanan sysadmin’ler için TMOUT çalışmaz, çünkü bu araçlar kendi oturum yönetimlerini kullanır. Bu detached oturumlar saatlerce, hatta günlerce arka planda çalışabilir.
tmux için inaktivite tabanlı kapatma ayarı:
# ~/.tmux.conf
set -g lock-after-time 600
set -g lock-command "vlock"
# Alternatif olarak oturumu tamamen kapat
# set-hook -g client-activity 'set-option -g activity-action none'
screen için ise .screenrc dosyasında:
# ~/.screenrc
# 10 dakika sonra kilitle
idle 600 lockscreen
Kurumsal ortamda screen/tmux detached oturumlarını düzenli temizlemek için bir cron job eklemek iyi bir pratiktir:
# Crontab'a ekle - her gece 02:00'de 24 saatten eski tmux oturumlarini temizle
0 2 * * * /usr/bin/tmux list-sessions 2>/dev/null | awk -F: '{print $1}' | xargs -I{} tmux kill-session -t {} 2>/dev/null
Zsh ve Diğer Shell’ler için Yapılandırma
Ekibinizde zsh kullananlar varsa (özellikle macOS’tan Linux’a geçişlerde bu sık görülür), benzer bir mekanizma mevcuttur:
# ~/.zshrc veya /etc/zsh/zshrc
TMOUT=600
TRAPALRM() {
echo "nOturum zaman asimi nedeniyle kapatiliyor..."
exit
}
fish shell için /etc/fish/conf.d/timeout.fish:
# Fish shell icin oturum zaman asimi
# Fish TMOUT desteklemez, alternatif yaklasim gerekir
set -x TMOUT 600
Fish shell doğrudan TMOUT‘u desteklemez, bu yüzden burada en temiz çözüm SSH seviyesinde timeout uygulamaktır.
Oturum İzleme ve Audit
Zaman aşımı ayarlamak kadar, bu zaman aşımlarını izlemek de önemlidir. Hangı oturumların ne zaman kapatıldığını bilmek, güvenlik denetimlerinde işe yarar.
auditd ile oturum olaylarını kayıt altına alabilirsiniz:
# auditd kurulumu (RHEL/CentOS)
sudo yum install audit -y
# Debian/Ubuntu
sudo apt install auditd -y
# Oturum olaylarini izle
sudo auditctl -a always,exit -F arch=b64 -S execve -k session_tracking
# Mevcut audit loglarini gozden gecir
sudo ausearch -k session_tracking | aureport -i
Aynı zamanda /var/log/auth.log veya /var/log/secure dosyaları oturum açma/kapama olaylarını kaydeder:
# Son oturum kapanma olaylarini goster
grep "session closed" /var/log/auth.log | tail -20
# Kullaniciya gore filtrele
grep "session closed for user ahmet" /var/log/auth.log
Yapılandırmayı Test Etme
Yaptığınız değişikliklerin gerçekten çalışıp çalışmadığını test etmeden production’a uygulamayın.
# TMOUT testı: Yeni bir bash oturumu ac ve bekle
bash --login -c 'TMOUT=10; export TMOUT; echo "10 saniye sonra kapanacak"; sleep 20; echo "Bu satir gorunmemeli"'
# SSH timeout testini simule et
# Baska bir terminalden bagli oturumu izle
watch -n 5 'who; echo "---"; loginctl list-sessions'
# sshd konfigurasyonunu dogrula
sudo sshd -T | grep -i alive
sudo sshd -T | grep -i grace
Değişiklikleri aşamalı olarak uygulayın. Önce test ortamında deneyin, sonra bir grup kullanıcıya, ardından tüm sisteme yayın. Özellikle production’da çalışan otomatik scriptlerin timeout’dan etkilenmediğinden emin olun.
Sık Yapılan Hatalar ve Çözümleri
Problem: TMOUT ayarlandı ama çalışmıyor.
Sebep büyük ihtimalle kullanıcının .bashrc veya .bash_profile dosyasında sonradan override etmesi ya da farklı bir shell kullanmasıdır:
# Kullanicinin gercekten hangi shell kullandigini kontrol et
grep kullanici_adi /etc/passwd | cut -d: -f7
# Readonly ayarini dogrula
bash -c 'source /etc/profile.d/autologout.sh; echo $TMOUT; TMOUT=9999; echo $TMOUT'
Problem: SSH bağlantısı düşüyor ama uzun süren komutlar da etkileniyor.
Çözüm: Timeout süresini artırmak yerine, uzun süren işlemler için screen veya tmux kullanmayı zorunlu hale getirin ve bu araçlar için kendi politikalarınızı belirleyin.
Problem: Cron job’lar veya servis hesapları da timeout’a düşüyor.
Çözüm: Bu hesaplar için ayrı bir shell policy belirleyin veya system hesapları için /etc/profile.d/autologout.sh içine istisna ekleyin:
# /etc/profile.d/autologout.sh
# Servis hesaplari icin timeout uygulanmaz
EXCLUDED_USERS="jenkins deploy ansible"
if echo "$EXCLUDED_USERS" | grep -qw "$USER"; then
return 0
fi
TMOUT=900
readonly TMOUT
export TMOUT
Sonuç
Oturum zaman aşımı yapılandırması, Linux sistem yönetiminde göz ardı edilmemesi gereken temel bir güvenlik katmanıdır. TMOUT değişkeni ile hızlı bir başlangıç yapabilir, SSH ClientAliveInterval parametreleriyle ağ seviyesinde kontrol ekleyebilir, systemd-logind ile masaüstü oturumlarını yönetebilirsiniz.
Kurumsal ortamlarda bu ayarları merkezi bir yapıda uygulamak, Ansible veya Puppet gibi araçlarla tüm sunuculara yaymak ve düzenli olarak denetlemek en sağlıklı yaklaşımdır. Sadece ayarı yapmak yetmez; oturum olaylarını audit log’larına almak ve zaman zaman bu logları gözden geçirmek de güvenlik döngüsünün parçası olmalıdır.
Son olarak, kullanıcılarınızı bu politikadan önceden haberdar edin. Ani bir “oturum kapatıldı” mesajı, özellikle kritik bir işlem sırasında, hem can sıkıcı hem de riskli olabilir. İyi bir timeout değeri, güvenlik ile kullanılabilirlik arasındaki dengeyi gözeterek belirlenmeli; genel amaçlı sunucular için 15-30 dakika, yüksek güvenlikli sistemler için 5-10 dakika makul bir başlangıç noktasıdır.