Yalnızca komut dosyalarını uzaktan çalıştırabilen bir kullanıcı ekleme


14

Ben sadece bir şey yapabilen bir kullanıcı oluşturmak istiyorum: ssh aracılığıyla belirli bir klasörde (bu sorunun amaçları için bizi arayalım /local/remote_only_scripts/foo) bulunan bir komut dosyası (ve komut dosyasına komut satırı bağımsız değişkenleri) belirtin ve bu komut dosyasını yürütmek ve çıktısını döndür.

Bazı örnekler verebilmek için kullanıcının yapmasını istemiyorum:

  • Hesaba yerel olarak giriş yapın. Giriş uygulaması /bin/login. /local/remote_only_scripts/fooKlasördeki bir komut dosyası değildir , bu nedenle kullanıcı tarafından çağrılmamalıdır.
  • Hesaba uzaktan giriş yapın. Tekrar giriş yapın (ssh tarafından ne denir?) İlgili klasörde bir betik değildir.
  • Dizinin içeriğini listeleyin. İçinde /bin/ls. Uygun dizinde bir komut dosyası değil.
  • Bu dizindeki bir dosyayı düzenleyin. emacs, vi, gedit diğer editörlerin çoğu bu dizinde senaryo değildir.
  • Bu dizindeki bir dosyanın içeriğini görüntüleyin.
  • Bu dizinde yürütme iznine sahip olmadığı bir dosyayı yürütün.

Bu olduklarını Not örnekleri ben kullanıcı yapabilmek istemiyorum diğer birçok işlem vardır. Bir eylemi düşünürken, "bu bir komut dosyası tarafından yapılıyor /local/remote_only_scripts/foomu?" cevap hayır ise kullanıcı bunu yapamaz. Cevabınız evet ise, kullanıcı bunu yapabilmelidir.

Not: "Kullanıcı ekleyerek" ne demek istediğimi açıklığa kavuşturalım. Bazı ssh alt sistemlerine kullanıcı eklemek demek istemiyorum. Aksine, bilgisayar sistemine bir kullanıcı eklemek demek. Yani, örneğin, debian kararlı çalışan bir sistemim var, adresi, www.hg.bar.com. Bir kullanıcı eklemek istiyorum (kuser, users-admin veya useradd veya benzeri bir şekilde) onu hg_guest olarak adlandırın. hg_guest yerel olarak giriş yapamaz veya yukarıdaki listedeki herhangi bir işlemi yapamaz. Tüm hg_guest yapabileceğiniz komut dosyaları "uzaktan" yürütmektir. Bunu ssh ile yapabilmesi gerektiğini söyledim, ancak şimdi düşünüyor olabilir, belki de ssh kullanmasına izin vermek yerel olarak oturum açmasına izin verebilir, bu yüzden başka bir mekanizma gerekli olabilir.

Yanıtlar:


12

Authority_keys dosyasında bir komut seçeneği var. Bu seçenekler tam olarak istediğinizi yapıyor gibi görünüyor.

Bunun bir chroot veya kısıtlanmış bir kabuk olmadığını unutmayın. Yalnızca bu komutları ssh üzerinden yürütmeye izin verir. Örneğin, şöyle olur:

ssh somehost /local/remote_only_scripts/foo

Bu yetkili_anahtarlar dosyası için:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

Kullanıcınızın yerel olarak oturum açmasını istemiyorsanız birçok yol vardır. Şunlardan birini yapabilirsiniz:

  • kabuğunu / bin / false olarak ayarlamanız yeterlidir ( ssh'nin geçerli bir oturum açması gerektiğinden / bin / true öğesine ihtiyacınız olabilir)
  • şifresini kilitle, bkz. passwd -l

EDIT : daha fazla kısıtlama seçeneği ekledi ve yerel erişimi nasıl kaldırdığınızı açıklığa kavuşturun.


İstemci tarafında ssh bu komutu belirtmeniz gerektiğini düşünmüyorum, bu her zaman yürütülecek 'zorla' komuttur;) Uzak sitedeki kullanıcı hala / etc / passwd içinde tanımlanan geçerli kabuk gerekiyor.
jirib

1
Ayrıca command=, no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptyhesabı gerçekten kısıtlamak için seçeneklere ihtiyaç vardır.
Mayıs'ta jofel

Tamam. Gecenin bir yarısı uyandım ve cevapları kontrol etmeye karar verdim. Uykulu olduğum için tüm cevabı asimile etmeyeceğim, ama beni şaşırtan bir şey soracağım. Bu, hg_quest'in bir tty'den oturum açmasını nasıl önler?
HandyGandy

@HandyGandy Bu en basit kısım. Bunu yapmanın 2 yolunu ekledim, ama sanırım daha fazlası var
Coren

0

Bunu kullanıcı için giriş kabuğu olarak deneyin:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

Muhtemelen bunu authorized_keysCoren cevabında olduğu gibi dosyada açıkça görmek isteyeceksiniz ; ancak '... / foo' yu değiştirin; program ile. Böyle SSH komutları engeller sftp, scpve ssh hostname command.


Kullanıcının yalnızca komutları dizininizden yürütebilmesini istiyorsanız (ve çok fazla yoksa), yukarıdaki okumanın "prog" unu çıkarabilir ve seçimlerden oluşan bir metin menüsü sunmak için bir select deyimi kullanabilirsiniz. ve daha sonra argümanlar için okuma yapın. Ayrıca, bir grup Ctrl-C'yi komut dosyasında çeşitli noktalara yazarsanız ne olduğundan emin olmak için bunu test ederim. Orada da bir tuzak komutu isteyebilirsiniz.
Joe

0

Şans eseri, sadece bir senaryoya erişmeleri gerekiyor, bu benim için gerçekten iyi çalışıyor. Kullanıcıyı ekleyin ve varsayılan kabuklarını komut dosyasının yoluna değiştirin. Ssh ile bağlandıklarında komut dosyasını yürütür ve oturumlarını kapatırlar.

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest: x: 2002: 100 :: / home / hg_guest: /local/remote_only_scripts/foo/script.sh

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.