2012-09-05 15 views
13

Başladıktan sonra Linux programımın root ayrıcalıklarını düşürmesini ve ayrıcalıklı olmayan bir hesaba geçmesini istiyorum. Özellikle, benim gereksinimleri için kanonik çeşitli örnekler çevrimiçi ama hiçbir şey bulduk:, modern Linux'ta kök ayrıcalıklarını kalıcı olarak bırakır

  1. bu kalıcı damla
  2. olmayan kökü
  3. sadece içmeliyiz hem (e) uid ve (e) gid olduğu Linux desteği (kernel> 2.6.32) tamamlayıcı gruplar

buldum iyi yaklaşım için

  • gerek yoktur:

    uid_t new_uid = ...; 
    gid_t new_gid = ...; 
    
    gid_t rgid, egid, sgid; 
    if (setresgid(new_gid, new_gid, new_gid) < 0) 
    { 
        perror("setresgid"); 
        exit(EXIT_FAILURE); 
    } 
    if (getresgid(&rgid, &egid, &sgid) < 0) 
    { 
        perror("getresgid"); 
        exit(EXIT_FAILURE); 
    } 
    if (rgid != new_gid || egid != new_gid || sgid != new_gid) 
    { 
        printf("unexpected gid"); 
        exit(EXIT_FAILURE); 
    } 
    
    if (setgroups(0, 0) != 0) 
    { 
        perror("setgroups"); 
        exit(EXIT_FAILURE); 
    } 
    
    uid_t ruid, euid, suid; 
    if (setresuid(new_uid, new_uid, new_uid) < 0) 
    { 
        perror("setresuid"); 
        exit(EXIT_FAILURE); 
    } 
    if (getresuid(&ruid, &euid, &suid) < 0) 
    { 
        perror("getresuid"); 
        exit(EXIT_FAILURE); 
    } 
    if (ruid != new_uid || euid != new_uid || suid != new_uid) 
    { 
        printf("unexpected uid"); 
        exit(EXIT_FAILURE); 
    } 
    

    bir exe bu sarın ve uid en ve gid en doğru kullanarak görünmesini gösterebilir: hepsi bu yüzden,

    ps -eO user,uid,ruid,suid,group,gid,rgid,sgid 
    

    programı ayrıcalıklı bağlantı noktasına bağlamak veya çoğu kök sahip olduğu dosyaları işlemek olamaz iyi.

    Ben de süreç herhangi bir beklenmedik capabilities(7) olmadığını doğrular (libcap-ng-utils dahil) captest program buldum.

    Ancak, güvenlik bir endişe olduğundan, tüm gerekli olmayan ayrıcalıkları doğru bir şekilde düşürdüğümden daha emin olmak isterim. Nasıl emin olabilirim?

    Teşekkürler.

  • +0

    https://github.com/wertarbyte/coreutils/blob/master/src/setuidgid.c (dışarı [setuidgid] kontrol ettiniz burada görülebilir http://cr.yp.to/daemontools/setuidgid .html)? Bu bir parçası. Bernstein's] (http://cr.yp.to/djb.html) [Daemon Tools paketi] (http://cr.yp.to/daemontools.html). Bu program için kaynağın gözden geçirilmesi yardımcı olabilir. –

    +0

    Bunun nasıl gerçekleştirilebileceğini görmek için sudo 'ya da' su 'kaynağına bir göz atabilirsiniz. – Kevin

    cevap

    1

    Bunu yapmanın "kanonik" yolu, günümüzde "daemontools" da yer alan QMail programında kullanılan 'setuidgid' kodunda D.J.Bernstein tarafından uygulandı. GNU coreutils kullanılan

    gerçek kod prosedürünün djb tarifine dayanmaktadır onun kod

    +0

    Ah, havalı. Devam edip bu cevabı kabul edeceğim, ancak lisans nedeniyle doğrudan kullanamıyorum. –

    +0

    Bağlantı bozuk. – alexander255

    +0

    için teşekkürler! Teşekkürler, şu anda düzeltilmiş – Jaromil

    İlgili konular