cephx
#
Para identificar clientes e proteger-se contra ataques man-in-the-middle, o Ceph oferece o sistema de autenticação cephx
. Neste contexto, os clientes são pessoas, como o usuário admin, ou serviços/daemons relacionados ao Ceph, por exemplo, OSDs, monitores ou Object Gateways.
O protocolo cephx
não atende à criptografia de dados em transporte, como TLS/SSL.
O cephx
usa chaves secretas compartilhadas para autenticação, o que significa que tanto o cliente quanto o cluster do monitor têm uma cópia da chave secreta do cliente. O protocolo de autenticação permite que ambas as partes comprovem uma para a outra que têm uma cópia da chave sem precisar revelá-la. Isso permite uma autenticação mútua: o cluster tem certeza de que o usuário possui a chave secreta, e o usuário também tem certeza de que o cluster tem uma cópia da chave secreta.
Um recurso de escalabilidade importante do Ceph é para evitar uma interface centralizada com o armazenamento de objetos do Ceph. Isso significa que os clientes do Ceph podem interagir diretamente com os OSDs. Para proteger os dados, o Ceph oferece o sistema de autenticação cephx
, que autentica clientes do Ceph.
Cada monitor pode autenticar clientes e distribuir chaves, portanto, não há nenhum ponto único de falha ou gargalo ao usar o cephx
. O monitor retorna uma estrutura de dados de autenticação que contém uma chave de sessão para uso na obtenção dos serviços do Ceph. Essa chave de sessão é autocriptografada com a chave secreta permanente do cliente para que apenas o cliente possa solicitar serviços dos Ceph Monitors. Em seguida, o cliente usa a chave de sessão para solicitar os serviços desejados do monitor, e o monitor emite um ticket para o cliente que lhe autenticará nos OSDs que realmente processam os dados. Os Ceph Monitors e OSDs compartilham um segredo, portanto, o cliente pode usar o ticket emitido pelo monitor com qualquer OSD ou servidor de metadados no cluster. Os tickets do cephx
expiram para que um invasor não consiga usar um ticket expirado ou uma chave de sessão obtida indevidamente. Este formato de autenticação evitará que invasores com acesso ao meio de comunicação criem mensagens falsas se passando por outro cliente ou alterem mensagens legítimas de outro cliente, desde que a chave secreta do cliente não seja revelada antes de expirar.
Para usar o cephx
, um administrador deve primeiro configurar clientes/usuários. No diagrama a seguir, o usuário client.admin
invoca ceph auth get-or-create-key
da linha de comando para gerar um nome de usuário e a chave secreta. O subsistema auth
do Ceph gera o nome de usuário e a chave, armazena uma cópia com o(s) monitor(es) e transmite o segredo do usuário de volta ao usuário client.admin
. Isso significa que o cliente e o monitor compartilham uma chave secreta.
cephx
#Para autenticar-se no monitor, o cliente envia o nome de usuário ao monitor. O monitor gera uma chave de sessão e a criptografa com a chave secreta associada ao nome de usuário e transmite o ticket criptografado de volta para o cliente. Em seguida, o cliente decodifica os dados com a chave secreta compartilhada para recuperar a chave de sessão. A chave de sessão identifica o usuário da sessão atual. Em seguida, o cliente solicita um ticket relacionado ao usuário, que é assinado pela chave de sessão. O monitor gera um ticket, criptografa-o com a chave secreta do usuário e o transmite de volta para o cliente. O cliente decodifica o ticket e o utiliza para assinar solicitações para OSDs e servidores de metadados em todo o cluster.
cephx
#
O protocolo cephx
autentica as constantes comunicações entre a máquina cliente e os servidores Ceph. Cada mensagem enviada entre um cliente e um servidor após a autenticação inicial é assinada usando um ticket que os monitores, OSDs e servidores de metadados podem verificar com o segredo compartilhado.
cephx
: MDS e OSD #A proteção oferecida por essa autenticação ocorre entre o cliente do Ceph e os hosts de cluster do Ceph. A autenticação não ultrapassa o cliente do Ceph. Se um usuário acessar o cliente do Ceph de um host remoto, a autenticação do Ceph não será aplicada à conexão entre o host do usuário e do cliente.
Esta seção descreve os usuários de cliente do Ceph e a autenticação e autorização no cluster de armazenamento do Ceph. Usuários são pessoas ou mecanismos de sistema, como aplicativos, que usam os clientes do Ceph para interagir com os daemons do cluster de armazenamento do Ceph.
Quando o Ceph é executado com a autenticação e a autorização habilitadas (padrão), você deve especificar um nome de usuário e um chaveiro que contém a chave secreta do usuário especificado (geralmente por meio da linha de comando). Se você não especificar um nome de usuário, o Ceph usará o client.admin
como padrão. Se você não especificar um chaveiro, o Ceph procurará um na configuração de chaveiros no arquivo de configuração do Ceph. Por exemplo, se você executar o comando ceph health
sem especificar um nome de usuário ou chaveiro, o Ceph interpretará o comando da seguinte forma:
ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health
Se preferir, você poderá usar a variável de ambiente CEPH_ARGS
para não ter que redigitar o nome de usuário e o segredo.
Seja qual for o tipo de cliente do Ceph (por exemplo, dispositivo de blocos, armazenamento de objetos, sistema de arquivos ou API nativa), o Ceph armazena todos os dados como objetos em pools. Os usuários do Ceph precisam ter acesso aos pools para ler e gravar dados. Os usuários do Ceph também devem ter permissões de execução para utilizar os comandos administrativos do Ceph. Os conceitos a seguir ajudarão você a entender o gerenciamento de usuários do Ceph.
Um usuário é uma pessoa ou um mecanismo de sistema, como um aplicativo. A criação de usuários permite controlar quem (ou o quê) pode acessar o cluster de armazenamento do Ceph, os pools e os dados dos pools.
O Ceph usa tipos de usuários. Para fins de gerenciamento de usuários, o tipo sempre será client
. O Ceph identifica os usuários no formato delimitado por ponto (.), que consiste no tipo e ID de usuário. Por exemplo, TYPE.ID
, client.admin
ou client.user1
. O motivo da definição de tipo do usuário é que os Ceph Monitors, OSDs e servidores de metadados também usam o protocolo cephx, mas eles não são clientes. A distinção do tipo de usuário ajuda a diferenciar os usuários que são clientes dos demais, otimizando o controle de acesso, o monitoramento de usuários e o rastreamento.
Um usuário de cluster de armazenamento do Ceph não é o mesmo que um usuário de armazenamento de objetos ou de sistema de arquivos do Ceph. O Ceph Object Gateway utiliza um usuário de cluster de armazenamento do Ceph para comunicação entre o daemon do gateway e o cluster de armazenamento, mas o gateway tem sua própria funcionalidade de gerenciamento para usuários finais. O sistema de arquivos do Ceph usa semânticas do POSIX. O espaço do usuário associado a ele não é o mesmo de um usuário de cluster de armazenamento do Ceph.
O Ceph usa o termo "recursos" (caps) para descrever a autorização de um usuário autenticado para executar as funcionalidades dos monitores, OSDs e servidores de metadados. Os recursos também podem restringir o acesso aos dados em um pool ou a um namespace em um pool. Um usuário administrador do Ceph define os recursos do usuário ao criá-lo ou atualizá-lo.
A sintaxe de recurso segue o formato:
daemon-type 'allow capability' [...]
Veja a seguir uma lista de recursos para cada tipo de serviço:
incluem r
, w
, x
e allow profile cap
.
mon 'allow rwx' mon 'allow profile osd'
incluem r
, w
, x
, class-read
, class-write
e profile osd
. Os recursos do OSD também permitem configurações de pool e namespace.
osd 'allow capability' [pool=poolname] [namespace=namespace-name]
requer apenas allow
ou fica em branco.
mds 'allow'
As entradas a seguir descrevem cada recurso:
Antecede as configurações de acesso para um daemon. Implica apenas no rw
para MDS.
Concede o acesso de leitura ao usuário. Necessário com monitores para recuperar o mapa CRUSH.
Concede ao usuário acesso de gravação em objetos.
Permite que o usuário chame métodos de classe (tanto de leitura quanto de gravação) e execute operações do auth
em monitores.
Permite que o usuário chame métodos de leitura de classe. Subconjunto do x
.
Permite que o usuário chame métodos de gravação de classe. Subconjunto do x
.
Concede ao usuário permissões de leitura, gravação e execução para determinado daemon/pool e permite executar comandos de admin.
Concede a um usuário permissões para conectar-se como OSD a outros OSDs ou monitores. Atribuído aos OSDs para permitir que eles processem o tráfego de heartbeat de replicação e o relatório de status.
Concede a um usuário permissões para conectar-se como MDS a outros MDSs ou monitores.
Concede a um usuário permissões para inicializar um OSD. Delegado a ferramentas de implantação para que elas tenham permissões para adicionar chaves ao inicializar um OSD.
Concede a um usuário permissões para inicializar um servidor de metadados. Delegado a ferramentas de implantação para que elas tenham permissões para adicionar chaves ao inicializar um servidor de metadados.
Um pool é uma partição lógica em que os usuários armazenam dados. No caso das implantações do Ceph, é comum criar um pool como partição lógica para tipos de dados semelhantes. Por exemplo, ao implantar o Ceph como back end para o OpenStack, uma implantação típica tem pools para volumes, imagens, backups, máquinas virtuais e usuários como client.glance
ou client.cinder
.
A funcionalidade de gerenciamento de usuários permite aos administradores de cluster do Ceph criar, atualizar e apagar usuários diretamente do cluster do Ceph.
Ao criar ou apagar usuários do cluster do Ceph, talvez você tenha que distribuir chaves aos clientes para que elas possam ser adicionadas aos chaveiros. Consulte a Seção 5.2.3, “Gerenciamento de chaveiro” para obter os detalhes.
Para listar os usuários em seu cluster, execute o seguinte:
ceph auth list
O Ceph listará todos os usuários em seu cluster. Por exemplo, em um cluster com dois nós, a saída de ceph auth list
tem esta aparência:
installed auth entries: osd.0 key: AQCvCbtToC6MDhAATtuT70Sl+DymPCfDSsyV4w== caps: [mon] allow profile osd caps: [osd] allow * osd.1 key: AQC4CbtTCFJBChAAVq5spj0ff4eHZICxIOVZeA== caps: [mon] allow profile osd caps: [osd] allow * client.admin key: AQBHCbtT6APDHhAA5W00cBchwkQjh3dkKsyPjw== caps: [mds] allow caps: [mon] allow * caps: [osd] allow * client.bootstrap-mds key: AQBICbtTOK9uGBAAdbe5zcIGHZL3T/u2g6EBww== caps: [mon] allow profile bootstrap-mds client.bootstrap-osd key: AQBHCbtT4GxqORAADE5u7RkpCN/oo4e5W0uBtw== caps: [mon] allow profile bootstrap-osd
Observe que a notificação TYPE.ID
para usuários é aplicada de modo que osd.0
especifique um usuário do tipo osd
e o ID seja 0
. client.admin
é um usuário do tipo client
e o ID é admin
. Observe também que cada entrada tem uma entrada key: value
, e uma ou mais entradas caps:
.
Você pode usar a opção -o nomedearquivo
com ceph auth list
para gravar a saída em um arquivo.
Para recuperar um usuário, chave e recursos específicos, execute o seguinte:
ceph auth get TYPE.ID
Por exemplo:
ceph auth get client.admin exported keyring for client.admin [client.admin] key = AQA19uZUqIwkHxAAFuUwvq0eJD4S173oFRxe0g== caps mds = "allow" caps mon = "allow *" caps osd = "allow *"
Os desenvolvedores também podem executar o seguinte:
ceph auth export TYPE.ID
O comando auth export
é idêntico a auth get
, mas também imprime o ID de autenticação interno.
A adição de um usuário cria um nome de usuário (TYPE.ID
), uma chave secreta e quaisquer recursos incluídos no comando que você usa para criar o usuário.
A chave do usuário permite que ele se autentique no cluster de armazenamento do Ceph. Os recursos do usuário lhe autorizam a ler, gravar ou executar Ceph Monitors (mon), Ceph OSDs (osd) ou servidores de metadados do Ceph (mds).
Há alguns comandos disponíveis para adicionar um usuário:
ceph auth add
Esse comando é a forma canônica de adicionar um usuário. Ele criará o usuário, gerará uma chave e adicionará quaisquer recursos especificados.
ceph auth get-or-create
Geralmente, esse comando é o método mais prático de criar um usuário, pois ele retorna um formato de arquivo de chaves com o nome de usuário (entre parênteses) e a chave. Se o usuário já existir, esse comando simplesmente retornará o nome de usuário e a chave no formato de arquivo de chaves. Você pode usar a opção -o nomedearquivo
para gravar a saída em um arquivo.
ceph auth get-or-create-key
Esse comando é um método prático de criar um usuário e retornar a chave dele (apenas). Ele é útil para clientes que precisam apenas da chave (por exemplo, libvirt
). Se o usuário já existir, esse comando retornará apenas a chave. Você pode usar a opção -o nomedearquivo
para gravar a saída em um arquivo.
Ao criar usuários de cliente, você pode criá-los sem recursos. Um usuário sem recursos pode apenas se autenticar, nada mais. Esse tipo de cliente não pode recuperar o mapa de cluster do monitor. No entanto, você pode criar um usuário sem recursos para adiar a adição de recursos usando o comando ceph auth caps
.
Um usuário comum tem pelo menos recursos de leitura no Ceph Monitor e recursos de leitura e gravação nos Ceph OSDs. Além disso, as permissões de OSD do usuário costumam limitar-se ao acesso a determinado pool.
root #
ceph auth add client.john mon 'allow r' osd \ 'allow rw pool=liverpool'root #
ceph auth get-or-create client.paul mon 'allow r' osd \ 'allow rw pool=liverpool'root #
ceph auth get-or-create client.george mon 'allow r' osd \ 'allow rw pool=liverpool' -o george.keyringroot #
ceph auth get-or-create-key client.ringo mon 'allow r' osd \ 'allow rw pool=liverpool' -o ringo.key
Se você conceder a um usuário recursos para OSDs, mas não restringir o acesso a determinados pools, o usuário terá acesso a todos os pools no cluster.
O comando ceph auth caps
permite especificar um usuário e mudar os recursos dele. A definição de novos recursos sobregravará os atuais. Para ver os recursos atuais, execute ceph auth get USERTYPE.USERID
. Para adicionar recursos, você também precisa especificar os recursos existentes quando usar o formato a seguir:
root #
ceph auth caps USERTYPE.USERID daemon 'allow [r|w|x|*|...] \
[pool=pool-name] [namespace=namespace-name]' [daemon 'allow [r|w|x|*|...] \
[pool=pool-name] [namespace=namespace-name]']
Por exemplo:
root #
ceph auth get client.johnroot #
ceph auth caps client.john mon 'allow r' osd 'allow rw pool=prague'root #
ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=prague'root #
ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
Para remover um recurso, você pode redefini-lo. Para que o usuário não tenha acesso a determinado daemon já definido, especifique uma string vazia:
root #
ceph auth caps client.ringo mon ' ' osd ' '
Para apagar um usuário, execute ceph auth del
:
root #
ceph auth del TYPE.ID
em que TYPE é client
, osd
, mon
ou mds
, e ID é o nome de usuário ou o ID do daemon.
Para imprimir a chave de autenticação do usuário em uma saída padrão, execute o seguinte:
root #
ceph auth print-key TYPE.ID
em que TYPE é client
, osd
, mon
ou mds
, e ID é o nome de usuário ou o ID do daemon.
A impressão da chave do usuário é útil quando você precisa preencher o software cliente com a chave do usuário (como libvirt
), conforme mostrado neste exemplo:
cephadm >
sudo mount -t ceph host:/ mount_point \
-o name=client.user,secret=`ceph auth print-key client.user`
Para importar um ou mais usuários, execute ceph auth import
e especifique um chaveiro:
cephadm >
sudo ceph auth import -i /etc/ceph/ceph.keyring
O cluster de armazenamento do Ceph adicionará novos usuários, as chaves e os recursos deles e atualizará os usuários existentes, as chaves e os recursos deles.
Quando você acessa o Ceph por um cliente, esse cliente procura um chaveiro local. Por padrão, o Ceph predefine a configuração de chaveiro com os quatro nomes de chaveiro a seguir, portanto, você não precisa defini-la em seu arquivo de configuração do Ceph, a menos que queira anular os padrões:
/etc/ceph/cluster.name.keyring /etc/ceph/cluster.keyring /etc/ceph/keyring /etc/ceph/keyring.bin
A metavariável cluster é o nome do cluster do Ceph conforme definido pelo nome do arquivo de configuração do Ceph. ceph.conf
significa que o nome do cluster é ceph
, portanto, ceph.keyring
. A metavariável name é o tipo e o ID de usuário. Por exemplo, client.admin
, portanto, ceph.client.admin.keyring
.
Após criar um usuário (por exemplo, client.ringo
), você deverá obter a chave e adicioná-la a um chaveiro no cliente do Ceph para que o usuário possa acessar o cluster de armazenamento do Ceph.
A Seção 5.2, “Gerenciamento de chaves” apresenta os detalhes de como listar, obter, adicionar, modificar e apagar usuários diretamente do cluster de armazenamento do Ceph. No entanto, o Ceph também oferece o utilitário ceph-authtool
para que você possa gerenciar chaveiros de um cliente do Ceph.
Ao usar os procedimentos na Seção 5.2, “Gerenciamento de chaves” para criar usuários, você precisa fornecer as chaves de usuário ao(s) cliente(s) do Ceph para permitir a recuperação da chave do usuário especificado e a autenticação no cluster de armazenamento do Ceph. Os clientes do Ceph acessam os chaveiros para pesquisar um nome de usuário e recuperar a chave do usuário:
cephadm >
sudo ceph-authtool --create-keyring /path/to/keyring
Durante a criação de um chaveiro com vários usuários, é recomendável usar o nome do cluster (por exemplo, cluster.keyring) para o nome de arquivo do chaveiro e gravá-lo no diretório /etc/ceph
para que a configuração padrão do chaveiro obtenha o nome do arquivo sem que você tenha que especificá-lo na cópia local do seu arquivo de configuração do Ceph. Por exemplo, crie ceph.keyring
executando o seguinte:
cephadm >
sudo ceph-authtool -C /etc/ceph/ceph.keyring
Durante a criação de um chaveiro com um único usuário, é recomendável usar o nome do cluster, o tipo de usuário e o nome de usuário e gravá-lo no diretório /etc/ceph
. Por exemplo, ceph.client.admin.keyring
para o usuário client.admin
.
Ao adicionar um usuário ao cluster de armazenamento do Ceph (consulte a Seção 5.2.2.3, “Adicionando usuários”), você pode recuperar o usuário, a chave e os recursos e gravá-lo em um chaveiro.
Para usar apenas um usuário por chaveiro, o comando ceph auth get
com a opção -o
gravará a saída no formato de arquivo do chaveiro. Por exemplo, para criar um chaveiro para o usuário client.admin
, execute o seguinte:
root #
ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring
Para importar usuários para um chaveiro, você pode usar ceph-authtool
para especificar o chaveiro de destino e de origem:
cephadm >
sudo ceph-authtool /etc/ceph/ceph.keyring \
--import-keyring /etc/ceph/ceph.client.admin.keyring
O Ceph inclui o comando ceph auth add
para criar um usuário diretamente no cluster de armazenamento do Ceph. No entanto, você também pode criar um usuário, as chaves e os recursos diretamente em um chaveiro de cliente do Ceph. Em seguida, você pode importar o usuário para o cluster de armazenamento do Ceph:
cephadm >
sudo ceph-authtool -n client.ringo --cap osd 'allow rwx' \
--cap mon 'allow rwx' /etc/ceph/ceph.keyring
Você também pode criar um chaveiro e adicionar um novo usuário a ele simultaneamente:
cephadm >
sudo ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo \
--cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key
Nos cenários anteriores, o novo usuário client.ringo
está apenas no chaveiro. Para adicionar o novo usuário ao cluster de armazenamento do Ceph, você ainda deve adicioná-lo ao cluster:
cephadm >
sudo ceph auth add client.ringo -i /etc/ceph/ceph.keyring
Para modificar os recursos do registro de um usuário em um chaveiro, especifique o chaveiro e o usuário seguidos dos recursos:
cephadm >
sudo ceph-authtool /etc/ceph/ceph.keyring -n client.ringo \
--cap osd 'allow rwx' --cap mon 'allow rwx'
Para atualizar o usuário modificado no ambiente de cluster do Ceph, você deve importar as mudanças do chaveiro para a entrada do usuário no cluster do Ceph:
root #
ceph auth import -i /etc/ceph/ceph.keyring
Consulte a Seção 5.2.2.7, “Importando usuários” para obter detalhes sobre como atualizar um usuário do cluster de armazenamento do Ceph de um chaveiro.
O comando ceph
suporta as seguintes opções relacionadas à manipulação de nome de usuário e segredo:
--id
ou --user
O Ceph identifica os usuários com um tipo e um ID (TYPE.ID, como client.admin
ou client.user1
). As opções id
, name
e -n
permitem especificar a parte do ID do nome de usuário (por exemplo, admin
ou user1
). Você pode especificar o usuário com --id e omitir o tipo. Por exemplo, para especificar o usuário client.foo, digite o seguinte:
root #
ceph --id foo --keyring /path/to/keyring healthroot #
ceph --user foo --keyring /path/to/keyring health
--name
ou -n
O Ceph identifica os usuários com um tipo e um ID (TYPE.ID, como client.admin
ou client.user1
). As opções --name
e -n
permitem especificar o nome completo do usuário. Você deve especificar o tipo de usuário (normalmente client
) com o ID de usuário:
root #
ceph --name client.foo --keyring /path/to/keyring healthroot #
ceph -n client.foo --keyring /path/to/keyring health
--keyring
O caminho para o chaveiro que contém um ou mais nomes de usuário e segredos. A opção --secret
tem a mesma funcionalidade, mas não funciona com o Object Gateway, que usa --secret
para outra finalidade. Você pode recuperar um chaveiro com ceph auth get-or-create
e armazená-lo localmente. Essa é a abordagem preferencial, pois você pode alternar nomes de usuário sem mudar o caminho do chaveiro:
cephadm >
sudo rbd map --id foo --keyring /path/to/keyring mypool/myimage