Grup Kimliğinin Belirtilmesi
Önceki XXIX. Oylum - Kullanıcılar ve Gruplar Sonraki
Grup Kimliğinin Belirtilmesi
Bu kısımda bir sürecin gerçek ve/veya etkin grup kimliklerini değiştiren işlevlere yer verilmiştir. Bu oluşumları kullanabilmek için sys/types.h ve unistd.h başlık dosyalarını yazılımınıza dahil etmeniz gerekir.
int setegid
(gid_t grupkim)
işlev
Bu işlev bir sürecin etkin grup kimliğini, sürecin etkin grup kimliğini grupkim olarak değiştirmesi mümkünse, grupkim ile belirtilen kimliğe ayarlar. seteuid işlevindeki gibi, bir ayrıcalıklı süreç (etkin kullanıcı kimliği sıfır olan süreç) kendi etkin grup kimliğini herhangi bir kullanıcı kimliği ile değiştirebilir. Bir ayrıcalıksız süreç ise dosya grup kimliğine sahipse, etkin grup kimliğini kendi gerçek grup kimliğine veya kendi dosya grup kimliğine değiştirebilir; aksi takdirde etkin grup kimliği değişmez.
Bir sürecin ayrıcalıklı süreç olması için etkin grup kimliğinin değil, etkin kullanıcı kimliğinin sıfır olması gerektiğini unutmayın. Etkin grup kimliği sadece erişim yetkilerini etkiler.
setegid işlevinin dönüş değerleri ve hata durumları seteuid ile aynıdır.
_POSIX_SAVED_IDS özelliği olmayan eski sistemlerde bu işlev yoktur.
int setgid
(gid_t grupkim)
işlev
Bu işlevi çağıran sürecin yetkisi varsa, sürecin gerçek ve etkin grup kimliği grupkim yapılır. İşlev ayrıca sürecin dosya grup kimliğini varsa siler.
Süreç istenen işlemi yapmaya yetkili değilse, bu işlev setegid gibi davranır.
İşlevin dönüş değerleri ve hata durumları seteuid ile aynıdır.
int setregid
(gid_t gerçekgrupkim,
 gid_t etkingrupkim)
işlev
Bu işlev sürecin gerçek grup kimliğini gerçekgrupkim ve etkin grup kimliğini etkingrupkim yapar. Eğer gerçekgrupkim değeri -1 ise bu, gerçek grup kimliğin değiştirilmeyeceği anlamına gelir. Benzer şekilde etkingrupkim değeri -1 ise etkin grup kimliği değiştirilmez.
setregidişlevi, dosya kimliklerini desteklemeyen 4.3 BSD Unix ile uyumluluk adına vardır. Bu işlevi sürecin etkin ve gerçek kullanıcı kimliklerini takaslamak için kullanabilirsiniz. (Ayrıcalıklı süreçler için böyle bir sınırlama yoktur.) Dosya kimlikleri destekleniyorsa, bu işlev bunun için kullanılmaz. Bkz. Setuid Erişiminin Etkinleştirilmesi ve İptali.
İşlevin dönüş değerleri ve hata durumları setreuid ile aynıdır.
setuid ve setgid işlevleri sürecin etkin kullanıcı kimliğinin sıfır olup olmamasına göre farklı davranırlar. Sıfırdan farklıysa, seteuid ve setegid gibi davranırlar. Bir karışıklıktan kaçınmak için, etkin kullanıcı kimliğinin sıfır olduğunu bilmedikçe ve sürecin aidiyetini kalıcı olarak değiştirmek istemedikçe daima seteuid ve setegid işlevlerini kullanmanızı öneririz. Bu durum yaygındır ve login ve su gibi çoğu uygulama buna ihtiyaç duyar.
Eğer yazılımınız root dışında bir kullanıcı için setuid ise yetkileri kalıcı olarak değiştirmenin bir yolu yoktur.
Sistem ayrıca yetkin süreçlerin kendi ek grup kimliklerini değiştirmesini mümkün kılmıştır. setgroups veya initgroups işlevlerini yazılımınızda kullanmak isterseniz, grp.h başlık dosyasını yazılımınıza dahil etmelisiniz.
int setgroups
(size_t miktar,
 gid_t *gruplar)
işlev
Bu işlev sürecin ek grup kimliklerini ayarlar. Sadece yetkin süreçten çağrılabilir. miktar argümanı ile gruplar dizisindeki grup kimliklerinin sayısı belirtilir.
İşlev başarılı ise 0 değilse -1 döner. Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EPERM
Çağıran süreç yetkisiz.
int initgroups
(const char *kullanıcı,
 gid_t       grup)
işlev
initgroups işlevi sürecin ek gruplarını kullanıcı kullanıcısının ek grupları olarak ayarlar. grup grubu bunlara eklenir.
Bu işlev grup veritabanını kullanıcı ile ilgili grupları bulmak için tarar. Oluşturulan liste için setgroups çağrısı yapar.
İşlevin dönüş değerleri ve hata durumları setgroups ile aynıdır.
Bir kullanıcının hangi grupların üyesi olduğunu bilmek ama sürecin ek grup kimliklerini değiştirmek istemiyoranız getgrouplist işlevini kullanabilirsiniz. getgrouplist işlevini kullanabilmek için yazılımınıza grp.h başlık dosyasını dahil etmelisiniz.
int getgrouplist
(const char *kullanıcı,
 gid_t       grup,
 gid_t      *gruplar,
 int        *grupsayısı)
işlev
getgrouplist işlevi kullanıcı'nın üyesi olduğu ek grupları saptamak için grup veritabanını tarar. Bu grup kimliklerinin en çok miktar kadarı gruplar dizisine kaydedilir; işlevin dönüş değeri işlev tarafından elde edilebilen grup kimliklerinin sayısı olur. Eğer miktar ek grup kimliklerinin sayısından küçükse, işlev -1 değeri ile döner ve grupların gerçek sayısını *grupsayısı'na atar. grup grubu bu listeye eklenir.
getgrouplist işlevinin ek grup kimliklerini öğrenmek için kullanılışına bir örnek:
gid_t *
supplementary_groups (char *user)
{
  int ngroups = 16;
  gid_t *groups
    = (gid_t *) xmalloc (ngroups * sizeof (gid_t));
  struct passwd *pw = getpwnam (user);

  if (pw == NULL)
    return NULL;

  if (getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups) < 0)
    {
      groups = xrealloc (ngroups * sizeof (gid_t));
      getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups);
    }
  return groups;
}
Önceki Üst Ana Başlık Sonraki
Kullanıcı Kimliğinin Belirtilmesi Başlangıç Setuid Erişiminin Etkinleştirilmesi ve İptali
Bir Linux Kitaplığı Sayfası