~/yazilar/ubuntu-server-kurulumdan-sonra-ilk-adimlar
Yeni kurulan bir Ubuntu sunucuda ilk işler
içindekiler
Kurulum sihirbazı bittiğinde elimde çalışan bir sunucu oluyor ama henüz işe koyulacak bir sunucu olmuyor. Hostname kurulumda aceleyle yazılmış, saat dilimi UTC'de kalmış, paketler ISO'nun hazırlandığı günden kalma. Bunları baştan düzeltmezsem sonradan log okurken, sertifika yenilerken ya da bir sorunu ararken karşıma çıkıyorlar.
Aşağıdaki adımları her yeni sunucuda aynı sırayla uyguluyorum. Hepsi toplamda yarım saat sürmez. Örnekler Ubuntu Server'ın güncel LTS sürümü için, fiziksel makinede de sanal makinede de aynı şekilde çalışıyor.
Önce nereye bağlandığına bak
Kurulumu konsoldan yaptıysan büyük ihtimalle kurulumda oluşturduğun kullanıcıyla giriş yapmışsındır. Bulut sağlayıcıların hazır image'larında ise durum farklı olabiliyor, bazen doğrudan root ile ya da ubuntu gibi varsayılan bir kullanıcıyla geliyorsun. İlk komut olarak kim olduğuma ve sistemin ne olduğuna bakıyorum:
whoami
cat /etc/os-release | head -4
uname -rdeploy
PRETTY_NAME="Ubuntu ... LTS"
NAME="Ubuntu"
VERSION_ID="..."Sürüm satırını burada bilerek boş bıraktım, senin ekranında hangi LTS kuruluysa o görünecek. Önemli olan LTS ibaresini görmek. Ara sürümler dokuz ay destek alıyor, sunucuya kurulacak şey değil.
Kendi kullanıcını oluştur
Root ile çalışmak istemiyorum. Kurulumda bir kullanıcı oluşturduysan bu adımı atlayabilirsin. Root ile geldiysen önce sudo yetkili bir kullanıcı açıyorum:
adduser deploy
usermod -aG sudo deployadduser parola ve birkaç isteğe bağlı bilgi soruyor. Parolayı güçlü bir şey seç, SSH anahtarına geçtikten sonra bile sudo bu parolayı isteyecek. Diğer alanları Enter ile geçebilirsin.
Grup üyeliğinin işe yaradığını görmek için yeni oturum açmak gerekiyor, mevcut oturumun grupları değişmiyor:
su - deploy
sudo -v && echo "sudo çalışıyor"Kullanıcı adı olarak deploy kullandım, sen kendi adını ya da ekibin kullandığı bir isimlendirmeyi kullanabilirsin. Ortak hesap açmak yerine herkesin kendi kullanıcısıyla girmesi, auth.log okurken kimin ne yaptığını görmeyi kolaylaştırıyor.
Hostname
Kurulumda yazdığım isim çoğu zaman geçici bir şey oluyor. Sunucunun adı loglarda, izleme sisteminde ve prompt'ta göründüğü için anlamlı olsun istiyorum:
sudo hostnamectl set-hostname web01
hostnamectl Static hostname: web01
Icon name: computer-vm
Chassis: vm
Virtualization: kvm
Operating System: Ubuntu ... LTShostnamectl sadece /etc/hostname dosyasını değiştiriyor. /etc/hosts içindeki eski isim olduğu gibi kalıyor. systemd-resolved yerel hostname'i kendisi çözdüğü için her kurulumda sorun çıkmıyor, ama resolved devrede değilse sudo her çalıştığında "unable to resolve host" uyarısı görebilirsin. Dosyayı yine de düzeltiyorum, isimle çalışan başka araçlar da oraya bakıyor:
127.0.0.1 localhost
127.0.1.1 web01.ornek.local web01Bulut image'larında bir tuzak daha var: cloud-init her açılışta hostname'i sağlayıcının verdiği değere geri çekebiliyor. Öyle bir durumda /etc/cloud/cloud.cfg içindeki preserve_hostname ayarına bak.
Saat dilimi ve zaman senkronizasyonu
Sunucular varsayılan olarak UTC ile geliyor. Bazı ekipler bilerek UTC'de bırakıyor, bu da mantıklı bir tercih: farklı bölgelerdeki sunucuların logları aynı saatle akıyor. Ortamdaki diğer sistemler (domain controller'lar, ağ cihazları, log sunucusu) yerel saatle çalışıyorsa sunucuyu da yerel saate çekmek karşılaştırmayı kolaylaştırıyor. Hangisini seçersen seç, bütün sunucularda aynısını yap. Yarısı UTC yarısı yerel saat olan bir ortamda log karşılaştırmak can sıkıcı.
timedatectl list-timezones | grep Istanbul
sudo timedatectl set-timezone Europe/Istanbul
timedatectl Local time: ... +03
Universal time: ... UTC
RTC time: ...
Time zone: Europe/Istanbul (+03, +0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: noBurada asıl baktığım satır System clock synchronized: yes. Saat kayarsa önce Kerberos ile kimlik doğrulama bozuluyor. TLS hataları ve birbirini tutmayan loglar da arkasından geliyor. no görüyorsan senkronizasyon servisini kontrol et.
Ubuntu'nun yeni sürümlerinde varsayılan zaman servisi değişti. Eski kurulumlarda systemd-timesyncd, yenilerde chrony geliyor. Hangisinin çalıştığını görmek için:
systemctl status chrony systemd-timesyncd --no-pager 2>/dev/null | grep -E "●|Active"Kurumda kendi NTP sunucun varsa (çoğu zaman domain controller'lar bu işi yapıyor) dışarıdaki havuz yerine onu kullanmak daha doğru. chrony için /etc/chrony/sources.d/ altına bir dosya ekliyorum:
# /etc/chrony/sources.d/kurum.sources
server ntp1.ornek.local iburst
server ntp2.ornek.local iburstsudo chronyc reload sources
chronyc sources -vchronyc sources çıktısında kendi sunucularının başında ^* (şu an kullanılan kaynak) ya da ^+ (kabul edilen kaynak) görmelisin. ^? ulaşılamıyor demek, büyük ihtimalle güvenlik duvarında UDP 123 kapalı.
Paketleri güncelle
ISO hazırlandıktan sonra çıkan güvenlik yamaları yüklü değil. İlk iş:
sudo apt update
sudo apt full-upgradeupgrade yerine full-upgrade kullanıyorum, çünkü yeni kernel gibi bağımlılığı değişen paketleri upgrade geride bırakabiliyor. İlk kurulumda geride bir şey kalsın istemiyorum.
Güncelleme bittikten sonra yeniden başlatma gerekip gerekmediğine bakıyorum:
cat /var/run/reboot-required 2>/dev/null
cat /var/run/reboot-required.pkgs 2>/dev/null*** System restart required ***
linux-image-...-generic
linux-baseDosya varsa yeniden başlatıyorum. Sunucu henüz hiçbir işe bakmıyorken yeniden başlatmanın kimseye maliyeti yok, bunu sonraya bırakmanın bir anlamı yok.
sudo rebootBundan sonraki güncellemeleri elle takip etmek yerine güvenlik yamalarını otomatiğe bağlamak mantıklı. Bunu serinin üçüncü yazısında unattended-upgrades ile anlatıyorum.
Temel araçlar
Minimal kurulumda bazı araçlar gelmiyor. Benim neredeyse her sunucuda istediğim paketler şunlar:
sudo apt install -y \
curl wget ca-certificates gnupg \
vim tmux htop ncdu tree \
git jq rsync unzip \
dnsutils mtr-tiny tcpdump \
bash-completionHepsine gerek yok, kendine göre ayıkla. Ağ tarafındakileri (dnsutils, mtr-tiny, tcpdump) özellikle kuruyorum, çünkü sorun çıktığı anda sunucunun internete çıkıp çıkamadığı bile belli olmayabiliyor. O sırada paket kurmaya çalışmak işe yaramaz.
net-tools (yani ifconfig ve netstat) eskide kaldı. Yerine ip ve ss var, ikisi de kurulu geliyor:
ip -br addr
ss -tulpnss -tulpn çıktısı sunucuda hangi portların dinlendiğini gösteriyor. Temiz bir kurulumda burada sadece SSH (22) ve belki DNS çözücünün yerel adresi (127.0.0.53) görmelisin. Tanımadığın bir şey varsa şimdi sor, sonra unutursun.
Netid State Local Address:Port Process
udp UNCONN 127.0.0.53%lo:53 users:(("systemd-resolve",...))
tcp LISTEN 0.0.0.0:22 users:(("sshd",...))
tcp LISTEN [::]:22 users:(("sshd",...))Disk ve bellek durumuna bir bak
Kurulumda disk düzenini varsayılan bıraktıysan Ubuntu LVM kullanmış ama diskin hepsini kök dosya sistemine vermemiş olabilir. Bunu en baştan görmek istiyorum:
df -h /
sudo vgsFilesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ...
VG #PV #LV #SN Attr VSize VFree
ubuntu-vg 1 1 0 wz--n- <...g <...gVFree sütununda ciddi bir boş alan görüyorsan sana verilmiş ama kullanılmayan disk var demek. Bunu kök dosya sistemine eklemek iki komut, ama nasıl yapılacağını ve neden bazen boş bırakmanın da mantıklı olduğunu LVM yazısında ayrıca anlatıyorum.
Bellek ve swap için free -h yeterli. Sunucuda swap yoksa ve bellek dar ise küçük bir swap dosyası eklemek OOM killer'ın bir servisi aniden öldürmesinden iyidir. Veritabanı sunucularında ise swap kararını o veritabanının kendi önerilerine göre vermek gerekiyor.
Kontrol listesi
Bunların hepsini tek tek hatırlamak yerine bir listeye bakıyorum. Kendi ortamına göre genişletebilirsin:
- Sudo yetkili kişisel kullanıcı açıldı, ayrı oturumda test edildi
- Hostname ayarlandı,
/etc/hostsdüzeltildi - Saat dilimi ortamın geri kalanıyla aynı
-
System clock synchronized: yes -
apt full-upgradeyapıldı, gerekiyorsa yeniden başlatıldı - Temel araçlar kuruldu
-
ss -tulpnçıktısında tanımadığım port yok - Disk düzeni ve boş alan kontrol edildi
- Sunucu envantere / izleme sistemine eklendi
Son madde komut değil ama listeden en çok düşen o. İzlemeye eklenmemiş bir sunucu, diski dolana kadar kimsenin aklına gelmiyor.
Sıradaki yazı: SSH'ı biraz daha güvenli hale getirmek