Basit Unix Sohbeti
(the-dam.org)suc, Slack/Mattermost tarzı sohbetin bazı temel işlevlerini UNIX temel bileşenleri ve Bash birleşimiyle hayata geçiren Simple Unix Chat’tir; çekirdek döngü 5 satırdır, ancak gerçek betik daha uzundur- Mesajlar standart girdiden satır satır okunur, tarih ve kullanıcı adı eklenir, ardından
/var/lib/suc/altındaki kanal dosyasına eklenir; kimlik doğrulama ve yetki kontrolü SSH’ye ve UNIX izin modeline bırakılır - Mattermost sunucusunun yalnızca Go kodu yaklaşık 500 bin satır iken,
sucçok daha küçük kodla benzer temel davranışın oluşturulabileceğini vurgular usuc,tail -f,rlwrap,pygmentizeve:komut önekini birleştirerek kanal okuma, Markdown tarzı çıktı ve komut sonucu paylaşımını işler- Kanallar basit metin dosyaları olduğu için
grep,tail,bat,lnav, Git hook’ları ve bot betikleri gibi UNIX araçlarıyla kolayca birbirine bağlanabilir
suc’nin azaltmaya çalıştığı karmaşıklık
suc, Simple Unix Chat’in kısaltmasıdır; Slack, Mattermost ve IRC’den daha az özelliğe sahiptir ve toplam satır sayısı 5 satırı aşar, ancak mesaj yazan çekirdek döngü 5 satırlık Bash’ten oluşur- Hedeflenen işlevler gerçek zamanlı zengin metin sohbeti, dosya paylaşımı, ayrıntılı erişim kontrolü, otomasyon ve dış araç entegrasyonu, aktarım sırasında şifreleme, isteğe bağlı olarak depolamada şifreleme ve kullanıcı kimlik doğrulamasıdır
- Küçük bir uygulama, modern UNIX uygulamalarının sunduğu tutarlı ve birleştirilebilir temel bileşenlerden yararlandığı için mümkündür
- Mattermost sunucusu karşıt örnek olarak yalnızca yaklaşık 500 bin satır Go kodundan oluşur;
suc’nin Mattermost’un temel işlevlerini bunun %0,005’i kadar kodla uygulayabileceği düşünülür
5 satırlık mesaj yazma döngüsü
suc’nin çekirdek Bash döngüsü standart girdiden bir satır okur, tarih ve gerçek kullanıcı adını ekler, ardından bunu/var/lib/suc/"$1"dosyasına ekler- Gerçek betik, güvenlik amaçlı ön işleme ve kullanıcı adı rengi hesaplaması nedeniyle daha uzundur; ancak sohbet geçmişi yazmanın temel davranışı üç başlıkta özetlenir
- Standart girdiden bir satır okuma
- Tarih ve gerçek kullanıcı adını ekleme
/var/lib/suc/altındaki kanal dosyasına ekleme
- Kimlik doğrulama, erişim kontrolü, şifreleme ve zengin metin
suciçindeki kod tarafından değil, SSH, UNIX erişim kontrolü API’leri ve metin tabanlı modülerlik tarafından sağlanır
Kimlik doğrulamadan SSH sorumlu
sucsüreci zaten kimliği doğrulanmış bir kullanıcı tarafından çalıştırıldığı içinsuciçinde kimlik doğrulama kodu yoktur- Uzak kimlik doğrulamasını, tipik bir UNIX sunucusunda olduğu gibi
sshhalleder- Parola gibi paylaşılan sırlar
- Kriptografik challenge
- Tek kullanımlık parola (OTP) üreten cihaz
- Birden fazla yöntemi birleştiren MFA
ssh, ortadaki adam saldırılarını önlemek için sunucuyu da istemciye doğrular ve istemci ile sunucu arasındaki tüm verileri şifrelersuckurulumu bir UNIX host’una vesshsunucu yapılandırmasına dayanır- Kullanıcı sistemde var olmalıdır
sshsunucusu ilgili kullanıcının uzaktan oturum açmasına izin vermelidir
- GNU Guix’te deklaratif yapılandırmayla kullanıcı ve SSH anahtarı tek satırda eklenebilir; yapılandırma satırı kaldırılırsa yeniden yapılandırma sırasında kullanıcı da kaldırılır
Erişim kontrolünden UNIX izin modeli sorumlu
suc, kimlik doğrulamanın yanı sıra erişim kontrolü kodu da içermez; bu yaklaşım güvenlik agnostisizmi (security agnosticism) olarak adlandırılır- UNIX çekirdeği kullanıcıları, grupları, süreçleri ve dosyaları bilir; dosya okuma/yazma izinlerine sürecin etkin sahibine (effective owner) göre karar verir
/var/lib/suciçindeki kanal dosyalarısuckullanıcısına aittir ve grup bazlı okuma izinleriyle kullanıcıların bazı kanalları okuyabilmesi sağlanır- Normal kullanıcılar dosyalara doğrudan yazmaz,
sucçalıştırır; izin eşleştirme ve engelleme çekirdek tarafından ele alınır - Daha kısıtlayıcı topluluklarda grup bazlı
setuidbinary’leri bulunabilir- Örneğin
suc_blue,bluekullanıcısına aittir ve yalnızcabluegrubu tarafından çalıştırılabilir bluegrubundaki kullanıcılarsuc_blueüzerindenbluekanalına yazabilirredgrubu kullanıcılarıbluekanalını okuyamaz veya yazamaz
- Örneğin
- Kanal oluşturma yardımcı betiği
suc_channel.shyaklaşık 80 satırdır; GNU Guix kullanıcıları(suc-private-channel "red" "red")şeklinde tek satırla gerekli setuid binary’sini, kullanıcıyı, grubu ve kanal dosyasını oluşturabilir - GNU Guix’in işlemsel güncellemeleri, yapılandırma değişikliklerinin ya tamamen uygulanmasını ya da hiç uygulanmamasını garanti eder ve önceki çalışan duruma geri dönülebilir
Zengin metin ve usuc
- Birçok sohbet uygulaması metni bir HTML motoruyla render eder; Mattermost masaüstü istemcisi Electron kullanır
suc, kanal başına tek bir metin dosyası kullanır; kullanıcılar bunutailveyacatgibi komut satırı araçlarıyla görüntüleyebilir- Terminalin ANSI escape kodları ve UTF-8 desteğinden yararlanarak renkler, emoji ve temel bir zengin metin deneyimi oluşturulabilir
sucyalnızca kanal dosyasına yazar; okuma işiniusucüstlenirsucyetkili bir binary olduğu için mantık ve dış bağımlılıklar en aza indirilmelidirusuc, çağıran kullanıcının izinleriyle çalıştığından özellikler daha serbestçe eklenebilir
usuc, birçok küçük aracı bir araya getirerek sohbet istemcisi rolü üstlenirrlwrapile geçmiş ve satır düzenleme işlevi sağlar- Kanal dosyasının sahibine göre uygun setuid
sucbinary’sini seçer tail -f -n 20ile son 20 satırı ve sonradan eklenen satırları gösterir- Girdi satırının
:ile başlayıp başlamadığını kontrol eder - Kullanıcının girdiği metni
pygmentizeile işler
pygmentize, standart girdiyi Markdown olarak görüp ANSI renkli metin çıktısı verdiği için**bold**gibi markup’ı tek satırlık kodla destekleyebilir
Sohbet komutları ve shell entegrasyonu
usuc, mesaj:ile başlıyorsa bunu normal mesaj olarak göndermez; ilgili komutu çalıştırır ve çıktı sonucunusucile gönderir- Örneğin
gum style --border=rounded --bold --foreground=#F00 "Hello World !"çalıştırıldığında kanalda kenarlık ve stil uygulanmış metin görünür - Komutlar
usuc’yi çağıran kullanıcının namespace’inde çalıştığı için kullanıcılar diğer kullanıcıları etkilemeden kendilerine ait sohbet makroları tutabilir - the dam içinde masaüstü rol yapma oyunları sırasında
roll 2d6gibi komutlarla zar atmak için kullanılır
Metin pipe’ları ve dış araç entegrasyonu
- Kullanıcılar
usuc’nin komut çalıştırma işlevi yerine shell’den komut çıktısını doğrudansuc’ye pipe edebilir bat’in renkli çıktısınısuc’ye göndererek kod parçaları kanalda sözdizimi vurgulu şekilde paylaşılabilirmake test > testlog || (suc devops < testlog ; exit 1), test başarısız olduğunda log’udevopskanalına gönderen tek satırlık Bash örneğidir- Bu tek satır bir Git deposunun
updatehook’una konabilir; push sırasında testleri çalıştırır, başarısız olursa güncellemeyi reddeder ve DevOps ekibini bilgilendirir - Slack veya Mattermost’taki entegrasyon işlevlerine karşılık gelen işler UNIX metin pipe’ları ve betikleriyle kurulabilir
Kanal okuma, bildirimler, botlar
suckanalı sürekli güncellenen bir metin dosyası olduğundantail -file yeni satırlar okunup işlenebilir- Yeni mesaj geldiğinde
notify-sendile bildirim gösteren bir pipeline kurulabilir;grepile yalnızca adlar veya “build failure” gibi anahtar kelimeler filtrelenebilir - Birden fazla kanalı tek bir feed’de birleştirmek için
tail -f /var/lib/suc/*kullanılabilir - lnav kullanıldığında okunan konumu hatırlama, yer imleri, kanal bazlı renkler, tarih/kullanıcı adı/kullanıcı tanımlı alan ayrıştırma, filtreleme ve SQL sorgularından yararlanılabilir
- Botlar, kanalı okuyup aynı anda yazabildiği sürece uygulanabilir
- Örnek, kanalda
33000 ftgibi uzunluk ifadelerini bulur unitskomutuyla metre birimine dönüştürür- Aynı kanala
[metric_bot] 33000 ft is 10058.4 meters.gibi bir yanıt yazar
- Örnek, kanalda
Karşılaştırma ve sonuç
- Karşılaştırma hedefleri olarak Slack, Mattermost ve Discord gibi büyük sistemler gösterilse de daha adil karşılaştırma hedefleri arasında IRC,
talkvewriteın da bulunduğu düşünülür - IRC’nin, geçmiş sohbet kayıtlarını okumak için bouncer gerektirmesi bakımından
suc’den daha az işlevsel olduğu değerlendirilir talk,ytalkvewallın modern Linux dağıtımlarında çalışır hâle getirilemediği belirtilirsuc, kimlik doğrulamayı SSH’ye, erişim kontrolü ve birleştirilebilirliği UNIX’e bırakır; kanalları metin dosyası olarak tutar- Araçlar metin okuyup yazabildiği sürece herhangi bir dilde yazılabilir
1 yorum
Hacker News görüşleri
Aklıma hemen “Master Foo and the Ten Thousand Lines” geldi: http://catb.org/~esr/writings/unix-koans/ten-thousand.html
Bu, Master Foo’nun kendisini ziyaret eden programcıya “bir satırlık shell script’te, 10 bin satır C kodundan daha fazla Unix doğası vardır” dediği hikâye
Eğer bir şeyin belirlenmiş çekirdek işlevi fazla kolay ve önemsiz biçimde yeniden üretilebiliyorsa, o işlev gerçek değerin çekirdeği ya da kaynağı olmayabilir
1980’lerden beri UI geliştirmenin ne kadarını yazılım mühendisliğinin içine alıp otomatikleştirdiğimizi, ya da bunun hâlâ saf insan sanatının alanı olup olmadığını merak ettiriyor
Slack ortaya çıkıp diğerlerini sahneden itmeden önce de, hem ticari hem açık kaynak tarafta bunu yapan zaten düzinelerce uygulama vardı
Slack’in asıl değeri bir sonraki katmanda. Görsel olarak hoş ve son derece sezgisel bir UI/UX sunuyor; böylece neredeyse herkes, eğitim, kurulum, kılavuz ya da öğretim olmadan oturur oturmaz kullanabiliyor. Teknik bilgi gerekmiyor ve “kullanıcı adı ile şifreyi gir”den fazlasını anlamasanız da geri kalanı kendiliğinden açık oluyor
Ama bu daha zor bir soruyu doğuruyor. Çok temel komut satırı çağrılarını yapabilen kullanıcıları biraz daha eğitmek gibi bir alternatife kıyasla Slack fiyatına değer mi? Slack’in veriyi elinde tutup geri vermemesi de hesaba katılırsa ne olur? Slack’ten ayrılmanın maliyeti ne kadar yüksek?
suc’un kullanışsız olduğu doğru, ama belki Slack’ten daha az şişkin ve daha az tekelci bir şeye doğru yakınsanabilir
Ortaya çıkan işi beğendim. Birleştirilebilirlik ile neler yapılabileceğini görmek güzel
Yine de bunu Slack vb. ile karşılaştırmak bana çok anlamlı gelmiyor. Hiçbir mühendis böyle birbirine bağlanmış bir şeyi prodüksiyonda sahiplenmek istemez. İnsan kaynağını nasıl bulacaksınız, test ve debug işlerini nasıl yapacaksınız, log ve analitiği nasıl yürüteceksiniz?
Bu yazı, Slack benzeri uygulamaların sohbet işlevinin bir kısmını kopyalıyor, ama sohbet bu tür uygulamaların %100’ü değil. Bunlar tamamen farklı ortamlarda üretilmiş şeyler; dolayısıyla mevcut durumu şişkin diye saldırmak Stockton Rush tarzı çarpık bir yorum gibi duruyor. Yazılımda gerçekten şişkinlik var, ama “Anne bak, ıvır zıvırdan bir denizaltı yaptım, demek ki pahalı denizaltılar aptalca” bunun yazarın amaçladığı karşı çıkış gibi gelmiyor
Tekil yardımcı araçları genelde ayrı ayrı anlamak, test etmek ve debug etmek kolaydır; logging zaten sistemin içinde var. syslog yok mu? Ayrıca neden analitik gerekli olsun?
Yine de Slack benzeri araçlar yeni özellikler yerine sadeliği agresif biçimde öncelemiş olsaydı nasıl görünürdü, gerçekten merak ediyorum. Sanki kapitalizmin bütünü bu tür geliştirmeleri teşvik etmiyor; bu yüzden makul ölçüde mümkün olan en sade kurumsal yazılım örneği pek yok. Yine de ilginç bir düşünce deneyi
Benzer biçimde doğrudan IRC üzerinde çalışan ii de var: https://tools.suckless.org/ii/
Tüm sohbetlerde tek bir standart dosya kullanıyor, kimlik doğrulama ve erişim kontrolünü IRC ağı doğrudan yönetiyor ve zaten pek çok UI mevcut. Bu yazıda olduğu gibi, eklentiler de herhangi bir dosyayı okuyup başka bir dosyaya yazan her şey olabilir
craigslist diyagramı gibi, Unix işlevlerindeki dilimleri alıp startup’lara dönüştüren bir spawn of unix diyagramı yapmak eğlenceli olabilir
https://thegongshow.tumblr.com/post/345941486/the-spawn-of-craigslist-like-most-vcs-that-focus
ftp/rsync => Dropbox
suc => Slack
...
Başlık clickbait gibi görünüp geçmeyi düşünüyorsanız, bir ölçüde clickbait sayılır ama aslında epey iyi bir yazıydı
suc(Simple Unix Chat) adlı bir aracı ele alıyor ve çok küçük bir kod tabanıyla Slack, Discord gibi sunucu işlevlerini gerçekleştiriyorYeni olan tarafı, mevcut Unix araçlarını ve metodolojilerini yeniden icat etmek yerine kullanması. Kimlik doğrulamayı SSH hallediyor, kanallar sadece birer dosya, yönetici/moderatör kontrolü ise kullanıcı grupları ve dosya izinleriyle sağlanıyor. Biçimlendirilmiş metin ya da dosya yükleme gibi şeyler için kanala istenen veriyi yazıp istemcinin bunu yorumlamasına izin vermek yeterli. Botlar da kanal dosyasına pipe bağlanınca çok kolay oluyor
Yazıdaki kanala mesaj yazan 5 satırla kusursuz bir Slack klonu yapılamaz ama gerçekten basit Unix araçlarıyla ne kadar ileri gidilebildiği oldukça etkileyici
“Her şey dosyadır” paradigmasıyla ve shell script’lerle yazılmış büyük ölçekli production sistemlerin neredeyse hiç olmamasının bir nedeni var. Gerçek dünyada kullanılacak, önemsiz olmayan sistemler için kabul edilemez bir yaklaşım olduğu için
Buna yönetici arayüzü, kullanıcı yönetimi arayüzü, genişletilebilirlik, webhook’lar vb. dahildir. “Herkes o kutuya giriş yaparsa Linux üzerinde diğer kullanıcılarla sohbet edebilir” demek bunların hiçbirini çözmüyor. Bu tür özellikler burada okuyanların çoğu doğmadan çok önce tüm *nix sistemlerinde zaten vardı
Ne yazık ki bu Plan 9 özelliği hâlâ Linux’a taşınmadı. “Okuma” ya da “yazma”ya benzer izin bitleri ama çok daha belirli
Yazarı suçlamıyorum; yazıda da bu nokta gayet dürüst biçimde belirtiliyor
Slack ve Discord’da ekran paylaşımı ve sesli sohbet var. Bunlar ek özellikler değil, pazardaki hakimiyetleri için oldukça belirleyici özellikler
Bu blog yazısının suc hakkında olduğunu ve başlığın biraz yanıltıcı olabileceğini en baştan dürüstçe kabul etse de, sonuçta suc ile doğrudan ilgili olmayan önemli bir mesajı var
Modern yazılımların neredeyse tamamı korkunç derecede şişkin. Zengin özellikli bir sohbet sunucusu için 1,7 milyon satır gerektiği fikri saçma. Bill Gates usulü söylersek, ne kadar uğraşsam da bir sohbet sunucusunda o kadar satır kodu “tüketebileceğimi” sanmıyorum
Sadece soruna dikkat çekmek ya da bir alternatif önermekle kalmayıp, tekerleği yeniden icat etmek zorunda olmadığımızı hatırlattığı için alkışı hak ediyor. Mevcut sistem ve alt sistemlerin özelliklerini, örneğin kimlik doğrulama ve şifreleme için SSH kullanmak gibi, ilk tasarlandıkları amaçtan farklı olsa bile o özelliklerin niyetine uygun şekilde akıllıca kullanmak hacker ruhunun güzel bir örneği
Keşke yazılım dünyası bu kavramdan çok şey öğrenebilse. Daha düşük maliyet, daha kısa geliştirme süresi ve işlevsel olarak aynı kodu yeniden yazmaya harcanan mühendislik zamanının azalması; geliştiriciler, şirketler, son kullanıcılar ve nihayetinde insanlık için iyi olur. Gelecekte bunun gibi daha fazla yaratıcı yıkım görmek isterim, ben de ilerideki projelerde böyle akıllı teknikler uygulamayı denemek isterim
webappdizininde[1] yer alıyor. Adından da anlaşılacağı gibi webapp, “Mattermost web uygulamasının istemci kodunu” içeriyorYani aslında sadece Go kod satırlarını saymak daha doğru olur
[0] https://github.com/mattermost/mattermost/tree/master/e2e-tests
[1] https://github.com/mattermost/mattermost/tree/master/webapp
Bu genelde çıkış hızını artırdığı ve organizasyonun boyutunu küçülttüğü için iyi bir fikir. Ama karmaşıklık ve soyutlama açısından büyük bir trade-off var. Soyutlama seviyesi yükseldikçe durum daha da kötüleşebiliyor. Yani tamamen sebepsiz değil
Günümüzde çoğu dağıtım, güvenlik gerekçeleriyle setuid bash script oluşturmayı engelliyor
Ancak belirli bir sudoers girdisiyle neredeyse aynı etki elde edilebilir
https://perldoc.perl.org/perlsec#Taint-mode
Bazı sistemlerde temel bir yarış durumu olabilir:
https://perldoc.perl.org/perlsec#Shebang-Race-Condition
sudo -Tkullanımına bakmak da faydalı olabilir:https://perldoc.perl.org/perlsec#Using-Sudo
Ruby'de yakın zamanda taint mode'un kaldırılmış olması üzücü. Taint tracking, script'lerin çok ötesine geçebilen güçlü bir mekanizmadır. Örneğin Rack/Rails'in
#html_safeyaklaşımı taint tracking ile ele alınsaydı daha katı çalışabilir, kirlenmiş kullanıcı string'leri SQL parçalarına bağlandığı/yerleştirildiği/formatlandığı anda hata vererek bir SQL injection sınıfını tasarım gereği engelleyebilirdiEskiden CGI/mod_perl üzerinde taint tracking'i çok etkili kullanan insanlar da vardı. Elbette sihirli bir çözüm değil ama hâlâ oldukça etkili bir araç
https://gitlab.com/edouardklein/suc/-/blob/master/suc_wrapper.c
GitLab deposundaki wrapper dosyasını görene kadar, okurken bir yöntem olmasını umuyordum
Bu ayrı bir konu ama talk(1)'den bahsedilmemesi şaşırtıcı: https://man.netbsd.org/talk.1
Güzel yanı, yalnızca yerel olarak alacak şekilde ayarlanabilmesi; böylece o makinede bir kullanıcı hesabı gerekiyor. Bu yüzden SDF gibi yerler veya daha büyük cluster'lar için uygun. Kimlik doğrulamayı kendiniz yapmak yerine PAM ya da BSD_Auth'a bırakabilirsiniz. Socket veya şifrelemeyi de kendiniz yapmak yerine TLS'e bırakabilirsiniz. SSH ile güvenli shell'e girip ardından tmux ve (n)talk kullanmak da mümkün
Elbette (n)talk C ile yazılmıştır, yani 5 satırlık bash değildir
[1] https://man7.org/linux/man-pages/man2/write.2.html