Slack entegrasyonu
Sorgu taleplerini Slack uygulaması ya da gelen webhook ile onaylayın — düğmeler, canlı güncelleme, /queryproxy, imzalı geri çağrılar, tek kullanımlık token.
Güncelleme:
Slack entegrasyonuyla yeni sorgu talepleri bir kanala Approve / Reject düğmeleriyle duyurulur; kararlar QueryProxy’ye geri akar — webdekiyle aynı kurallarla (rol denetimi, kendine onay yok) ve kriptografik doğrulamayla.
Bir takımı bağlamanın iki yolu vardır ve ikisi yan yana bulunabilir:
| Slack uygulaması | Gelen webhook | |
|---|---|---|
| Kuran | Kurulum için bir kez yönetici, sonra takım başına DBA Add to Slack ile | Takım başına DBA |
| Mesajlar | Bot tarafından gönderilir ve talebin bütün ömrü boyunca yerinde güncellenir | Bir kez gönderilir; karardan sonra güncellenir |
| Ekstralar | Thread özeti, isteğe bağlı doğrudan mesajlar, /queryproxy komutu, kimlik önerileri |
Yok |
| Secret | Uygulamanın signing secret’ı, ortam değişkeninde | Takım başına signing secret, veritabanında |
Bir takımda ikisi de varsa uygulama kullanılır. Webhook kipi önceki sürümlerden değişmemiştir ve aşağıda anlatılır.
Slack uygulaması
Bir kurulumun bütün takımlarına tek Slack uygulaması hizmet eder. İşletmeci onu bir kez oluşturur ve kimlik bilgilerini ortama yazar; her takım sonra tek tıkla kendi çalışma alanına kurar.
Uygulamayı oluşturun
-
api.slack.com/apps adresinde bir Slack uygulaması oluşturun.
-
OAuth & Permissions altında
https://queryproxy-sunucunuz/integrations/slack/callbackyönlendirme URL’sini ve şu bot kapsamlarını ekleyin:chat:write,chat:write.public,commands,im:write,incoming-webhook,users:readveusers:read.email. -
Interactivity & Shortcuts altında etkileşimi,
https://queryproxy-sunucunuz/webhooks/slack/interactionsistek URL’siyle açın. -
Slash Commands altında
/queryproxykomutunuhttps://queryproxy-sunucunuz/webhooks/slack/commandsistek URL’siyle oluşturun. -
Event Subscriptions altında istek URL’sini
https://queryproxy-sunucunuz/webhooks/slack/eventsyapın veapp_uninstallediletokens_revokedbot olaylarına abone olun. -
Basic Information’dan client id’yi, client secret’ı ve signing secret’ı ortama yazın ve konteynerleri yeniden başlatın:
QUERYPROXY_SLACK_CLIENT_ID=... QUERYPROXY_SLACK_CLIENT_SECRET=... QUERYPROXY_SLACK_SIGNING_SECRET=...
Bunlar ayarlanana kadar ChatOps sayfası hangi değişkenlerin eksik olduğunu söyler ve Add to Slack düğmesi göstermez.
Takım için kurun
Takımın bir DBA’i (ya da bir sistem yöneticisi) ChatOps’u açıp Add to Slack düğmesine basar. Slack onay ve mesajların gideceği kanalı sorar; tarayıcı sonra QueryProxy’ye döner. Sayfa çalışma alanını, kanalı ve kuranı gösterir. Düğmeye yeniden basmak başka bir kanala ya da çalışma alanına kurar.
Kurulum, tarayıcı oturumuna bağlı, 10 dakika geçerli ve tek kullanımlık bir
state ile OAuth v2 kullanır; eksik, bayat ya da yabancı state taşıyan bir
geri çağrı 403 ile reddedilir ve Slack’e hiç gidilmez. Bot token’ı takım başına
şifreli saklanır. Slack’in kanal için verdiği webhook URL’si saklanmaz. Denetim
günlüğü slack.installed kaydeder, token’ı asla.
Uygulama ne yapar
- Güncel kalan kartlar. Talep kartını bot gönderir ve talep ilerledikçe yerinde düzenler: onaylandı, reddedildi, iptal edildi, çalışıyor, tamamlandı ya da başarısız. Adım başına yeni mesaj yoktur. Hatırlatmayla değiştirilen kart düğmeleri kaldırılarak Moved: use the newer message olarak düzenlenir.
- Thread özeti. Bir çalışma bitince bot, kartın thread’ine durum, satır sayısı, süre ve bir bağlantıyla yanıt verir. Yanıtta SQL, sonuç verisi ya da hata metni yoktur.
- Onaylayanlara doğrudan mesaj. ChatOps sayfasındaki isteğe bağlı bir anahtar, Slack üye kimliği olan her takım DBA’sına (talep sahibi hariç) bağlantılı kısa bir mesaj yollar. SQL ve düğme taşımaz.
/queryproxy komutu
/queryproxy, Slack’te kişinin kullanabildiği bağlantılarla bir form açar. Gönderim,
Slack’ten geldiği işaretli olağan bir talep açar; aynı korumalardan geçer ve aynı
onayı bekler. Form açılmadan önce ve gönderilirken QueryProxy, Slack
kullanıcısının aktif bir QueryProxy kullanıcısıyla eşleştiğini, bağlantının
takımının uygulamayı o çalışma alanına kurduğunu ve kullanıcının bağlantıyı
kullanabildiğini denetler; aksi hâlde yalnızca o kişi bir hata görür. Aynı formu iki
kez göndermek iki talep açmaz. Birkaç QueryProxy takımı tek Slack çalışma alanını
paylaşıyorsa form hepsinin kullanılabilir bağlantılarını, en çok 100, listeler.
Slack kullanıcılarını QueryProxy kullanıcılarına eşleme
Slack tıklamaları, kullanıcıdaki Slack üye kimliği üzerinden QueryProxy
kullanıcısı olarak işlem yapar (webhook kurulumunun son
adımına bakın). Kurulumdan sonra ve haftada bir QueryProxy, kimliği olmayan her
kullanıcıyı e-posta adresiyle arar ve bir eşleşme önerir. Öneriler Users
sayfasında Slack matching suggestions altında görünür. Bir sistem yöneticisi
öneriyi onaylar: üye kimliği bağlanır ve chat_identity.linked olarak, kaynağı
slack_suggestion ile denetlenir; ya da reddeder: öneri silinir (haftalık
tarama aynısını yeniden önerebilir). Hiçbir şey otomatik bağlanmaz.
Uygulamayı kaldırma
ChatOps sayfasındaki Remove app (DBA ya da yönetici) saklanan bot token’ını ve
çalışma alanının önerilerini siler; slack.uninstalled olayını removed_by_user
nedeniyle ve işlemi yapan kişiyle yazar. Slack’e token’ı iptal etmesini söylemez;
bu yüzden uygulamayı Slack’te çalışma alanından da kaldırın. Takımın yapılandırılmış
bir webhook’u varsa çalışmaya devam eder.
Slack app_uninstalled ya da tokens_revoked gönderdiğinde veya bot token’ını
reddettiğinde de QueryProxy kurulumu kendiliğinden düşürür (slack.uninstalled,
neden token_rejected).
Ayarlar
| Değişken | Varsayılan | Anlamı |
|---|---|---|
QUERYPROXY_SLACK_CLIENT_ID |
yok | Slack uygulamasının client id’si |
QUERYPROXY_SLACK_CLIENT_SECRET |
yok | Slack uygulamasının client secret’ı |
QUERYPROXY_SLACK_SIGNING_SECRET |
yok | Slack uygulamasının signing secret’ı; Slack’in gönderdiği her isteği doğrular |
QUERYPROXY_SLACK_RATE_LIMIT |
300 |
Slack çalışma alanı başına dakikadaki istek (etkileşimler, komutlar, olaylar); imza doğrulandıktan sonra sayılır |
İmza denetlenmeden önce her adres Slack uç noktalarına dakikada 120 istek
gönderebilir; aşılınca yanıt 429 olur. İki sınır ayrıdır; böylece sahte trafik bir
çalışma alanının bütçesini tüketemez. Teams ucunun kendi sınırı vardır.
Yükseltme, bir takımın webhook URL’sini ve signing secret’ını isteğe bağlı yapan iki migration çalıştırır; böylece takım yalnızca uygulamayı kullanabilir. Uygulaması olup kendi signing secret’ı olmayan bir takım, bir sistem yöneticisi secret girene kadar webhook URL’si kaydedemez; bu ilk girişte yürürlükteki secret sorulmaz.
Gelen webhook: kurulum
-
api.slack.com/apps adresinden çalışma alanınız için bir Slack uygulaması oluşturun.
-
Incoming Webhooks’u etkinleştirin ve onay kanalınız (ör.
#db-approvals) için bir webhook ekleyin. -
Interactivity’yi etkinleştirin ve istek URL’sini şuna ayarlayın:
https://queryproxy-sunucunuz/webhooks/slack/interactions -
QueryProxy’de ChatOps’u açın; webhook URL’sini ve uygulamanın signing secret’ını yapıştırın. İkisi de şifreli saklanır. İlk kurulum secret’sız kaydedilemediği için bu adımı bir sistem yöneticisi yapar; sonrasında webhook URL’sini ve açık/kapalı bayrağını takımın DBA’leri güncellemeye devam eder. Webhook URL’si
https://olmalı ve host’u izin listesinde bulunmalıdır (varsayılan olarakhooks.slack.com,*.webhook.office.com,*.logic.azure.comve*.powerplatform.com; liste sohbet sağlayıcıları arasında ortaktır;QUERYPROXY_CHAT_WEBHOOK_ALLOWED_HOSTSile genişletin). -
Sistem yöneticisi olarak Teams & Users → Manage users ekranını açın ve her onaylayıcının Slack üye kimliğini girin (ör.
U0123ABC— Slack profilinde Copy member ID ile görünür). Bu eşleme, Slack tıklamalarını QueryProxy kullanıcılarına bağlar.
Kırıcı değişiklik — signing secret’ı yalnızca sistem yöneticisi belirleyebilir. Bir DBA artık secret’ı giremez ya da döndüremez; webhook URL’si ve enabled bayrağı DBA’lerde kalır. Mevcut secret’ı değiştirmek için yönetici, yürürlükteki secret’ı da girmek zorundadır — secret bilgisi, rotasyonu uçtan devralmadan ayıran tek şeydir. Gerekçe: HMAC yalnızca “çağıranın secret’ı bildiğini” kanıtlar, “şu kişi onayladı” demez; secret’ı kendi seçebilen bir DBA, kendi talebini bir meslektaşı adına onaylayıp denetim izine o kişinin adını yazdırabiliyordu. ChatOps’u zaten kurmuş kurulumlarda secret’ın yükseltmeden sonra bir kez döndürülmesi önerilir.
Aynı gerekçeyle entegrasyonu silmek de yalnızca sistem yöneticisinin işidir: yeniden kurmak için gereken secret’ı ancak bir yönetici girebildiği için, silme düğmesi bir DBA’in elinde takımın ChatOps’tan tek yönlü çıkışı olurdu. DBA’in gündelik, geri alınabilir kontrolü Enabled bayrağını kapatıp kaydetmektir.
Nasıl görünür
Bir talep gönderildiğinde QueryProxy; talep sahibi, bağlantı, SQL önizlemesi (400
karakterde kesilir; metin ve sayı literalleri varsayılan olarak ? görünür,
QUERYPROXY_CHAT_INCLUDE_SQL önizlemeyi full ya da none yapar) ve
üç aksiyonla bir mesaj yayınlar: Approve, Reject ve Open in
QueryProxy. Karardan sonra mesaj yerinde güncellenir — düğmeler kaybolur ve
sonuç görünür; bayat bir mesajdan ikinci kez karar verilemez.
Slack’ten yapılan redler “Rejected via Slack by <isim>” genel gerekçesini kaydeder. Yazılı gerekçe için web arayüzünden reddedin.
Yönetici override’ı olacak bir Approve basışı (onaylayan takımın DBA’si
değil ya da kendi talebine karar veriyor) uygulanmaz. Her override yazılı bir
gerekçe ister; bu yüzden Slack, gerekçeyi gireceğiniz web formuna bir bağlantıyla
yanıt verir ve aksiyon token’ı harcanmaz. QUERYPROXY_PENDING_REMIND_AFTER saat
(varsayılan 4) boyunca pending kalan bir talep, yeni bir mesajla bir
hatırlatma alır; süresi dolmuş eski bir mesajın düğmesi ise daha yeni mesaja
işaret eden bir yanıt verir.
Kırıcı değişiklik — bu sürümden önce gönderilmiş mesajlardaki düğmeler çalışmaz. Her Approve / Reject düğmesi artık, yalnızca o talebe bağlı, 24 saat ömürlü ve tek kullanımlık bir aksiyon token’ı taşır. Eski mesajlarda böyle bir token yoktur; tıklama doğrulanamadı mesajıyla geri çevrilir. O talepleri web arayüzünden karara bağlayın — yeni gönderilen talepler token’lı düğmelerle gelir.
Güvenlik
Slack’ten gelen her geri çağrı, herhangi bir şey olmadan önce doğrulanır:
- İmza —
X-Slack-Signaturebaşlığıv0=HMAC_SHA256("v0:{timestamp}:{raw_body}", signing_secret)ile sabit zamanlı karşılaştırmayla eşleşmelidir. - Tekrar koruması —
X-Slack-Request-Timestamp’e göre ±5 dakikadan eski istekler reddedilir. - Aksiyon token’ı — düğmenin taşıdığı token canlı, kullanılmamış ve tam olarak o talebe bağlı olmalıdır. Böylece geri çağrı, QueryProxy’nin gerçekten yayınladığı bir mesajı yanıtlar ve her mesaj yalnızca bir kez karar verir; secret’ı elinde tutmak tek başına yoktan bir karar uydurmaya ya da yakalanmış bir tıklamayı yeniden oynatmaya yetmez. Token karar gerçekten kaydedildikten sonra yakılır — yetkilendirmeye takılan bir tıklama kanalın hakkını harcamaz.
- Kimlik — tıklayan Slack kullanıcısı, bir yöneticinin oluşturduğu eşleme üzerinden bir QueryProxy kullanıcısına çözülmeli; bu kullanıcı ya entegrasyonun takımına üye olup o takımda DBA rolünü taşımalı ya da admin olmalıdır. Eşlenmemiş veya yetkisiz kullanıcılar özel bir hata mesajı görür; hiçbir şey değişmez.
- Kurallar — kendine onay Slack’te de aynen engellidir. Webde olduğu gibi admin’ler DBA rolü kuralını ve kendine onay engelini aşabilir; kuralı aşan bir admin onayı denetim günlüğünde işaretlenir.
Sahte veya bayat bir geri çağrı 401 döner ve hiçbir durumu değiştirmez.
Geri çağrılar Slack uygulamasının signing secret’ıyla
(QUERYPROXY_SLACK_SIGNING_SECRET) ya da gelen webhook kipinde takımın kendi
signing secret’ıyla doğrulanır. /queryproxy komutu, açtığı form ve Events ucu
yalnızca uygulamanın secret’ını kabul eder: takıma özgü secret orada
reddedilir. Slack uçları, Ayarlar altında anlatıldığı gibi hız
sınırlıdır.