~/yazilar/ubuntu-server-kurulumdan-sonra-ilk-adimlar

Yeni kurulan bir Ubuntu sunucuda ilk işler

6 dk okuma

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 -r
deploy
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 deploy

adduser 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 ... LTS

hostnamectl 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 web01

Bulut 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: no

Burada 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 iburst
sudo chronyc reload sources
chronyc sources -v

chronyc 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-upgrade

upgrade 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-base

Dosya 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 reboot

Bundan 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-completion

Hepsine 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 -tulpn

ss -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 vgs
Filesystem                         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  <...g

VFree 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/hosts düzeltildi
  • Saat dilimi ortamın geri kalanıyla aynı
  • System clock synchronized: yes
  • apt full-upgrade yapı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