Converter spwd.db para master.passwd, especificar caminhos

0

Eu preciso produzir master.passwd dado spwd.db e pwd.db, como se pode fazer com pwd_mkdb -p . No entanto, preciso especificar os caminhos de entrada e saída.

Então, dado somesuch/spwd.db e somesuch/pwd.db , quero produzir somesuch/master.passwd .

Eu tentei ingenuamente algo nos moldes de pwd_mkdb -p -d somesuch/ somesuch/spwd.db sem sucesso ("Tipo ou formato de arquivo inadequado").

    
por chao-mu 22.01.2014 / 23:13

1 resposta

2

Você não pode produzir master.passwd de spwd.db com pwd_mkdb. A opção -p gera apenas um arquivo /etc/passwd , o que não contém os hashes de senha!

O procedimento adequado é restaurar master.passwd de seus backups. Se você não possui, este é um bom exemplo do porquê você deve ter backups de todos os seus dados de configuração!

Verifique /var/backups para cópias de backup de master.passwd .

Se não houver backups, você terá que reconstituir master.passwd do conteúdo de spwd.db . Os arquivos /etc/pwd.db e /etc/spwd.db são arquivos do banco de dados Berkeley:

file /etc/pwd.db
/etc/pwd.db: Berkeley DB 1.85 (Hash, version 2, native byte-order)

Se você quiser ler esses bancos de dados, você pode, por exemplo use o programa db4_dump185 de /usr/ports/databases/db4 .

Ao ler os arquivos dessa maneira, observe as seguintes informações do código fonte de /usr/src/usr.sbin/pwd_mkdb/pwd_mkdb.c :

    /*
     * The databases actually contain three copies of the original data.
     * Each password file entry is converted into a rough approximation
     * of a ''struct passwd'', with the strings placed inline.  This
     * object is then stored as the data for three separate keys.  The
     * first key * is the pw_name field prepended by the _PW_KEYBYNAME
     * character.  The second key is the pw_uid field prepended by the
     * _PW_KEYBYUID character.  The third key is the line number in the
     * original file prepended by the _PW_KEYBYNUM character.  (The special
     * characters are prepended to ensure that the keys do not collide.)
     */

Leia o código-fonte acima mencionado para ver como as linhas são armazenadas no banco de dados com hash:

#define COMPACT(e)      t = e; while ((*p++ = *t++));
#define SCALAR(e)       store = htonl((uint32_t)(e));      \
                        memmove(p, &store, sizeof(store)); \
                        p += sizeof(store);
#define LSCALAR(e)      store = HTOL((uint32_t)(e));       \
                        memmove(p, &store, sizeof(store)); \
                        p += sizeof(store);
#define HTOL(e)         (openinfo.lorder == BYTE_ORDER ? \
                        (uint32_t)(e) : \
                        bswap32((uint32_t)(e)))

e

                    /* Create secure data. */
                    p = sbuf;
                    COMPACT(pwd.pw_name);
                    COMPACT(pwd.pw_passwd);
                    SCALAR(pwd.pw_uid);
                    SCALAR(pwd.pw_gid);
                    SCALAR(pwd.pw_change);
                    COMPACT(pwd.pw_class);
                    COMPACT(pwd.pw_gecos);
                    COMPACT(pwd.pw_dir);
                    COMPACT(pwd.pw_shell);
                    SCALAR(pwd.pw_expire);
                    SCALAR(pwd.pw_fields);
                    sdata.size = p - sbuf;
    
por 24.01.2014 / 10:35

Tags