-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

[I've droped lkml]

KaiGai Kohei wrote:
>> But !cap_xxx is a bit misunderstandable for me. Someone may misunderstand
>> this line means any capabilities except for cap_xxx.

I like '!', but you're going to code it... ;-) I can live with b:.

>> Thus, I think that using "b:" and omittable "i:" prefix is better than "!".
>> In addition, what is your opinion about using "-b:" and "-i:" to represent
>> dropping capabilities currently they have?

I'd prefer something simple:

  i: set inheritable exactly (don't retain any other than these)
  b: drop exactly these (leave the others untouched)

>> There is one more uncertain case.
>> When a user belongs to several groups with capabilities configuration,
>> what capabilities are to be attached for the user?
> 
>> e.g) When kaigai belong to @pingers and @paccters
> 
>> b:cap_sys_pacct        @paccters
>> b:cap_net_raw        @pingers
>> -b:cap_dac_override,cap_net_raw        kaigai

The pam_cap module currently just accepts the first valid 'i:'(sic)
entry for the user. Since groups are not supported, this made sense.
With support for groups, I can see a compelling case for "OR". So, if
you want to support an "OR" policy, I say go for it.

Cheers

Andrew

> 
>> If we apply "OR" policy, kaigai get only cap_sys_pacct, because
>> he got cap_sys_pacct and cap_net_raw came from @paccters and @pingers
>> but cap_dac_override and cap_net_raw are dropped by the third line.
> 
>> Thanks,
> 
> Cheers
> 
> Andrew
> 
>>>> Thanks,
>>>>
>>>>> Cheers
>>>>>
>>>>> Andrew
>>>>>
>>>>> [EMAIL PROTECTED] wrote:
>>>>>> Quoting KaiGai Kohei ([EMAIL PROTECTED]):
>>>>>>> Serge E. Hallyn wrote:
>>>>>>>> The capability bounding set is a set beyond which capabilities
>>>>>>>> cannot grow.  Currently cap_bset is per-system.  It can be
>>>>>>>> manipulated through sysctl, but only init can add capabilities.
>>>>>>>> Root can remove capabilities.  By default it includes all caps
>>>>>>>> except CAP_SETPCAP.
>>>>>>> Serge,
>>>>>>>
>>>>>>> This feature makes me being interested in.
>>>>>>> I think you intend to apply this feature for the primary process
>>>>>>> of security container.
>>>>>>> However, it is also worthwhile to apply when a session is starting
>>>>>>> up.
>>>>>>>
>>>>>>> The following PAM module enables to drop capability bounding bit
>>>>>>> specified by the fifth field in /etc/passwd entry.
>>>>>>> This code is just an example now, but considerable feature.
>>>>>>>
>>>>>>> build and install:
>>>>>>> # gcc -Wall -c pam_cap_drop.c
>>>>>>> # gcc -Wall -shared -Xlinker -x -o pam_cap_drop.so pam_cap_drop.o
>>>>>>> -lpam
>>>>>>> # cp pam_cap_drop.so /lib/security
>>>>>>>
>>>>>>> modify /etc/passwd as follows:
>>>>>>>
>>>>>>> tak:x:1004:100:cap_drop=cap_net_raw,cap_chown:/home/tak:/bin/bash
>>>>>>>                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>>>> example:
>>>>>>> [EMAIL PROTECTED] ~]$ ping 192.168.1.1
>>>>>>> PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
>>>>>>> 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.23 ms
>>>>>>> 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.02 ms
>>>>>>>
>>>>>>> --- 192.168.1.1 ping statistics ---
>>>>>>> 2 packets transmitted, 2 received, 0% packet loss, time 999ms
>>>>>>> rtt min/avg/max/mdev = 1.023/1.130/1.237/0.107 ms
>>>>>>>
>>>>>>> [EMAIL PROTECTED] ~]$ ssh [EMAIL PROTECTED]
>>>>>>> [EMAIL PROTECTED]'s password:
>>>>>>> Last login: Sat Dec  1 10:09:29 2007 from masu.myhome.cx
>>>>>>> [EMAIL PROTECTED] ~]$ export LANG=C
>>>>>>> [EMAIL PROTECTED] ~]$ ping 192.168.1.1
>>>>>>> ping: icmp open socket: Operation not permitted
>>>>>>>
>>>>>>> [EMAIL PROTECTED] ~]$ su
>>>>>>> Password:
>>>>>>> pam_cap_bset[6921]: user root does not have 'cap_drop=' property
>>>>>>> [EMAIL PROTECTED] tak]# cat /proc/self/status | grep ^Cap
>>>>>>> CapInh: 0000000000000000
>>>>>>> CapPrm: 00000000ffffdffe
>>>>>>> CapEff: 00000000ffffdffe
>>>>>>> [EMAIL PROTECTED] tak]#
>>>>>> Neat.  A bigger-stick version of not adding the account to
>>>>>> group wheel.  I'll use that.
>>>>>>
>>>>>> Is there any reason not to have a separate /etc/login.capbounds
>>>>>> config file, though, so the account can still have a full name?
>>>>>> Did you only use that for convenience of proof of concept, or
>>>>>> is there another reason?
>>>>>>
>>>>>>> # BTW, I replaced the James's address in the Cc: list,
>>>>>>> # because MTA does not accept it.
>>>>>> Thanks!  I don't know what happened to my alias for him...
>>>>>>
>>>>>> thanks,
>>>>>> -serge
>>>>>>
>>>>>>> -- 
>>>>>>> KaiGai Kohei <[EMAIL PROTECTED]>
>>>>>>>
>>>>>>> ************************************************************
>>>>>>>     pam_cap_drop.c
>>>>>>> ************************************************************
>>>>>>>
>>>>>>> /*
>>>>>>>  * pam_cap_drop.c module -- drop capabilities bounding set
>>>>>>>  *
>>>>>>>  * Copyright: 2007 KaiGai Kohei <[EMAIL PROTECTED]>
>>>>>>>  */
>>>>>>>
>>>>>>> #include <errno.h>
>>>>>>> #include <pwd.h>
>>>>>>> #include <stdlib.h>
>>>>>>> #include <stdio.h>
>>>>>>> #include <string.h>
>>>>>>> #include <syslog.h>
>>>>>>> #include <sys/prctl.h>
>>>>>>> #include <sys/types.h>
>>>>>>>
>>>>>>> #include <security/pam_modules.h>
>>>>>>>
>>>>>>> #ifndef PR_CAPBSET_DROP
>>>>>>> #define PR_CAPBSET_DROP 24
>>>>>>> #endif
>>>>>>>
>>>>>>> static char *captable[] = {
>>>>>>>     "cap_chown",
>>>>>>>     "cap_dac_override",
>>>>>>>     "cap_dac_read_search",
>>>>>>>     "cap_fowner",
>>>>>>>     "cap_fsetid",
>>>>>>>     "cap_kill",
>>>>>>>     "cap_setgid",
>>>>>>>     "cap_setuid",
>>>>>>>     "cap_setpcap",
>>>>>>>     "cap_linux_immutable",
>>>>>>>     "cap_net_bind_service",
>>>>>>>     "cap_net_broadcast",
>>>>>>>     "cap_net_admin",
>>>>>>>     "cap_net_raw",
>>>>>>>     "cap_ipc_lock",
>>>>>>>     "cap_ipc_owner",
>>>>>>>     "cap_sys_module",
>>>>>>>     "cap_sys_rawio",
>>>>>>>     "cap_sys_chroot",
>>>>>>>     "cap_sys_ptrace",
>>>>>>>     "cap_sys_pacct",
>>>>>>>     "cap_sys_admin",
>>>>>>>     "cap_sys_boot",
>>>>>>>     "cap_sys_nice",
>>>>>>>     "cap_sys_resource",
>>>>>>>     "cap_sys_time",
>>>>>>>     "cap_sys_tty_config",
>>>>>>>     "cap_mknod",
>>>>>>>     "cap_lease",
>>>>>>>     "cap_audit_write",
>>>>>>>     "cap_audit_control",
>>>>>>>     "cap_setfcap",
>>>>>>>     NULL,
>>>>>>> };
>>>>>>>
>>>>>>>
>>>>>>> PAM_EXTERN int
>>>>>>> pam_sm_open_session(pam_handle_t *pamh, int flags,
>>>>>>>                     int argc, const char **argv)
>>>>>>> {
>>>>>>>     struct passwd *pwd;
>>>>>>>     char *pos, *buf;
>>>>>>>     char *username = NULL;
>>>>>>>
>>>>>>>     /* open system logger */
>>>>>>>     openlog("pam_cap_bset", LOG_PERROR | LOG_PID, LOG_AUTHPRIV);
>>>>>>>
>>>>>>>     /* get the unix username */
>>>>>>>     if (pam_get_item(pamh, PAM_USER, (void *) &username) !=
>>>>>>> PAM_SUCCESS || !username)
>>>>>>>         return PAM_USER_UNKNOWN;
>>>>>>>
>>>>>>>     /* get the passwd entry */
>>>>>>>     pwd = getpwnam(username);
>>>>>>>     if (!pwd)
>>>>>>>         return PAM_USER_UNKNOWN;
>>>>>>>
>>>>>>>     /* Is there "cap_drop=" ? */
>>>>>>>     pos = strstr(pwd->pw_gecos, "cap_drop=");
>>>>>>>     if (pos) {
>>>>>>>         buf = strdup(pos + sizeof("cap_drop=") - 1);
>>>>>>>         if (!buf)
>>>>>>>             return PAM_SESSION_ERR;
>>>>>>>         pos = strtok(buf, ",");
>>>>>>>         while (pos) {
>>>>>>>             int rc, i;
>>>>>>>
>>>>>>>             for (i=0; captable[i]; i++) {
>>>>>>>                 if (!strcmp(pos, captable[i])) {
>>>>>>>                     rc = prctl(PR_CAPBSET_DROP, i);
>>>>>>>                     if (rc < 0) {
>>>>>>>                         syslog(LOG_NOTICE, "user %s could not drop
>>>>>>> %s (%s)",
>>>>>>>                                username, captable[i],
>>>>>>> strerror(errno));
>>>>>>>                         break;
>>>>>>>                     }
>>>>>>>                     syslog(LOG_NOTICE, "user %s drops %s\n",
>>>>>>> username, captable[i]);
>>>>>>>                     goto next;
>>>>>>>                 }
>>>>>>>             }
>>>>>>>             break;
>>>>>>>         next:
>>>>>>>             pos = strtok(NULL, ",");
>>>>>>>         }
>>>>>>>         free(buf);
>>>>>>>     } else {
>>>>>>>         syslog(LOG_NOTICE, "user %s does not have 'cap_drop='
>>>>>>> property", username);
>>>>>>>     }
>>>>>>>     return PAM_SUCCESS;
>>>>>>> }
>>>>>>>
>>>>>>> PAM_EXTERN int
>>>>>>> pam_sm_close_session(pam_handle_t *pamh, int flags,
>>>>>>>                      int argc, const char **argv)
>>>>>>> {
>>>>>>>     /* do nothing */
>>>>>>>     return PAM_SUCCESS;
>>>>>>> }
>>>>>>>
>>>>>>> ************************************************************
>>>>>>> -
>>>>>>> To unsubscribe from this list: send the line "unsubscribe
>>>>>>> linux-security-module" in
>>>>>>> the body of a message to [EMAIL PROTECTED]
>>>>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>>> 

- -
To unsubscribe from this list: send the line "unsubscribe
linux-security-module" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>>

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (Darwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFHU6kj+bHCR3gb8jsRAurSAJ9wcNfrH4jLc+1A1UxGDrYrBsEe8QCgwsbD
fIlVTt6CFSzicJ+2foXorXA=
=/bvL
-----END PGP SIGNATURE-----
-
To unsubscribe from this list: send the line "unsubscribe 
linux-security-module" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to