URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID12
Нить номер: 4465
[ Назад ]

Исходное сообщение
"Кто использует squid_ldap_group?"

Отправлено dsl , 30-Окт-06 10:25 
сижу не пойму :)
подскажите можно ли его настроить на стандартный posixGroup ?
и возможно ли его использовать как external_acl как LOGIN и SRC тип в полях значений memberUid?

Содержание

Сообщения в этом обсуждении
"Кто использует squid_ldap_group?"
Отправлено dsl , 30-Окт-06 13:27 
>сижу не пойму :)
>подскажите можно ли его настроить на стандартный posixGroup ?
>и возможно ли его использовать как external_acl как LOGIN и SRC тип
>в полях значений memberUid?

блин куча параметров и нифига не умеет :)
вообщем вот, кому надо:

/*
    external acl for squid
    group_ldap_acl.c
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <ldap.h>

#define SIZESTRING 256

ssize_t getline(char **, size_t *, FILE *);

void PrintHelp(const char *name){

    fprintf(stderr, "Usage: %s [OPTIONS]\n", name);
    fprintf(stderr, "  -s\tserver LDAP\n");
    fprintf(stderr, "  -g\tfull DN to group\n");
    fprintf(stderr, "  -a\tsearch attributes (defaults memberUid)\n");
    fprintf(stderr, "  -h\tprint this help and exit\n");

    exit(1);
}

int LdapSearch(LDAP *ldap, const char *fulldn, char *attr, const char *origin){

    LDAPMessage *res = NULL;
    LDAPMessage *entry = NULL;
    BerElement *ber = NULL;
    char **vals = NULL;
    char *attrs[2];
    int result = 0;
    int i;

    attrs[0] = attr;
    attrs[1] = NULL;

    ldap_search_s(ldap, fulldn, LDAP_SCOPE_BASE, NULL, attrs, 0, &res);

    if(ldap_count_entries(ldap, res)){

        entry = ldap_first_entry(ldap, res);

        if(NULL != (attr = ldap_first_attribute(ldap, entry, &ber))){

            vals = ldap_get_values(ldap, entry, attr);

            for(i = 0; NULL != vals[i]; ++i) if(0 == strcasecmp(origin, vals[i])){ result = 1; break; }

            ldap_value_free(vals);
            ldap_memfree(attr);
        }
    }

    if(ber) ber_free(ber, 0);
    if(res) ldap_msgfree(res);
    
    return result;
}

int main(int argc, char **argv){

    opterr = 0;

    int c = 0;
    int port = 389;
    const char *server = NULL;
    const char *groupdn = NULL;
    char *attr = "memberUid";
    char *inputline = NULL;
    LDAP *ldap = NULL;
    size_t len = 0;
    struct in_addr in;
    struct hostent *hp;

    while((c = getopt(argc, argv, "ha:g:s:")) != -1)
        switch (c){

            case 'a':
                attr = optarg;
                break;

            case 'g':
                groupdn = optarg;
                break;

            case 's':
                server = optarg;
                break;

            case '?':
            case 'h':
                PrintHelp(argv[0]);
                break;

            default:
                break;
        }

    if(!groupdn || !server) PrintHelp(argv[0]);

    // ldap init
    if(NULL == (ldap = ldap_init(server, port))){
        fprintf(stderr, "error: ldap init.");
        exit(1);
    }
    
    // ldap bind
    c = ldap_simple_bind_s(ldap, NULL, NULL);
    if(c){
        fprintf(stderr,"%s\n", ldap_err2string(c));
        exit(1);
    }

    // input buffer
    if(NULL == (inputline = (char *) malloc(SIZESTRING))){
        fprintf(stderr, "error: malloc, size: %d\n", SIZESTRING);
        exit(1);
    }

    // stream stdout buffer off
    setvbuf(stdout, NULL,  _IONBF, 0);
    
    // main cycle
    len = SIZESTRING;
    while(0 < getline(&inputline, &len, stdin)){

        inputline[strlen(inputline) - 1] = '\0';

        if(!(c = LdapSearch(ldap, groupdn, attr, inputline)) &&
            inet_aton(inputline, &in) && (hp = gethostbyaddr((char *) &in.s_addr, sizeof(in.s_addr), AF_INET)))
                c = LdapSearch(ldap, groupdn, attr, hp->h_name);

        c ? fprintf(stdout, "OK\n") : fprintf(stdout, "ERR\n");
    }

    free(inputline);

    if(ldap != NULL) ldap_unbind(ldap);

    exit(0);
}

Теперь в posixGroup можно хранить и имена пользователей и имена компьютеров и по ip адресам, причем ищется в memberUid (изменяемый параметр -a)
компилировать с флагом -lldap
Использовать как пример:

external_acl_type EXT_DENYUSERS ttl=60 children=3 %LOGIN /etc/squid/group_ldap_acl -s ldap.local -g cn=squid_allow,ou=group,dc=local
acl USERS_DENY external EXT_DENYUSERS