Como desencorajar o compartilhamento de chaves de API internas em uma empresa?

37

Estamos trabalhando em um novo serviço - esse serviço poderá ser chamado diretamente de aplicativos nos dispositivos do usuário. Esses aplicativos serão desenvolvidos e suportados por várias equipes de desenvolvimento de toda a organização, tudo dependendo dos dados que fornecemos.

Estamos interessados ​​em identificar quais aplicativos estão enviando quais solicitações, para que possamos identificar padrões de uso e desenvolvedores responsáveis. (Para evitar dúvidas, a autenticação do usuário é tratada separadamente.)

Nossa solução é exigir chaves de API, uma por aplicativo - então temos detalhes de contato para a equipe de desenvolvimento.

Não queremos que as chaves da API sejam uma fonte de atrito, mas estamos preocupados que os desenvolvedores as compartilhem com colegas de outras equipes, o que significa que não podemos mais identificar o tráfego para apenas um aplicativo.

Como podemos incentivar os desenvolvedores a não compartilhar chaves de API internamente?

Oli
fonte
5
Como essas equipes acessarão a API? Via rede interna? Geralmente, equipes diferentes são colocadas em sub-redes diferentes para que você possa impor o uso de uma certa chave de API pela rede ... De qualquer forma, a solução social é dizer a eles "é importante que você não compartilhe essa chave de API não por segurança, mas porque nós precisamos das métricas de diferentes usuários para aprimorá-la. Se alguém solicitar, basta pedir que nos solicitem e forneceremos com prazer e eficiência uma chave de API ".
Giacomo Alzetta
3
Se você não deseja que as pessoas compartilhem chaves com colegas, inclua um arquivo de configuração que é ignorado pelo sistema de versões (para que a chave nunca seja confirmada) e facilite a criação de novas chaves. Ninguém se incomodará em compartilhar uma chave secreta se outro desenvolvedor puder criar facilmente uma nova chave sozinho. O problema com o compartilhamento de chaves pessoais geralmente é um problema causado pelo fato de que obter novas chaves leva tempo.
Sulthan
Você já pensou em solicitar registro quando o aplicativo foi iniciado pela primeira vez? Pode mostrar uma tela inicial solicitando os detalhes de contato do usuário (ou qualquer informação necessária) e, em seguida, emitir a chave da API no local.
John Wu
"Como podemos incentivar os desenvolvedores a não compartilhar chaves de API internamente?" Em termos simples, amarre todas as chaves ao endereço MAC da (s) placa (s) de rede nos computadores que as executam. Os protocolos de rede impedem que os mesmos endereços MAC sejam usados ​​na mesma rede, impedindo que as pessoas usem as mesmas chaves repetidamente. Eu teria transformado isso em uma resposta, mas atualmente não tenho o representante.
Blerg 12/09
Curiosamente, não vejo a palavra "rotação" (como na rotação de chaves - expiração / rotação de credenciais) em qualquer lugar desta página no momento. Depois que alguém obtém uma chave, ela tem uma vida útil finita, após a qual deve ser girada fora de uso e substituída por uma nova? Se não, por que não?
Michael - sqlbot 12/09

Respostas:

76

Para compartilhar essas chaves entre as equipes, as equipes precisam conversar, concordar em compartilhar e compartilhá-las. Isso leva tempo. Portanto, se uma equipe pode solicitar as chaves da API a você de forma mais rápida e fácil, não há incentivo para compartilhar.

E a maneira mais fácil de solicitar essas chaves é antecipá-las. Supondo que você conheça todas as outras equipes que precisarão de chaves de API, crie-as e compartilhe-as antes de disponibilizar o serviço para elas.

Há outro incentivo que você pode oferecer: suporte à depuração. Essas equipes desejarão sua ajuda quando as coisas não funcionarem corretamente quando integrarem o trabalho deles ao seu serviço. Essas chaves de API permitem rastrear suas solicitações específicas e, assim, ajudar na depuração do que está acontecendo de errado. Portanto, venda isso como o motivo das chaves, em vez de " identificar padrões de uso e desenvolvedores responsáveis ", que parece que você está espionando as atividades deles.

David Arno
fonte
2
Re: compartilhamento, em um mundo ideal, você está certo - mas você pressupõe que eles tenham informações perfeitas (embora eu possa ajudá-lo a direcioná-los para documentos do esquema, raiz do terminal e quaisquer erros) e gerenciamento cooperativo, e não a realidade em que tudo o que eles podem ter é o ponto final e algum código copiado de outra equipe que eles foram encaminhados por um gerente sênior.
Oli
3
Re: antecipando, você está absolutamente certo, devemos criar e enviar agressivamente as chaves para as partes interessadas. O que eu não mencionei é que alguns desses aplicativos usam uma estrutura / interface comum, e talvez possamos injetar ou aplicar semi-automaticamente chaves únicas nessa camada, mas isso não se aplica a todos os aplicativos.
Oli
11
@ Ewan, se você simplesmente desabilitar o acesso à chave fornecida, todos os usuários executarão para você - não há necessidade de persegui-los. E então você pode dar a eles chaves únicas :)
Alexei Levenkov
15
A antecipação deve assumir o seguinte formato: acessar a API sem a chave produz uma mensagem de erro com um link para a página em que você solicita a chave. Não espere que alguém leia a documentação. Os incentivos não funcionam quando ninguém os conhece.
candied_orange 11/09
11
Se mensagens de erro ou logs de depuração fossem enviados automaticamente por e-mail para um endereço vinculado à chave, qualquer pessoa que desejasse os dados teria um incentivo para usar sua própria chave - e qualquer pessoa que fosse compartilhada pela chave teria um incentivo para rastrear a pessoa que a compartilhou. e fazê-los parar.
Robin Bennett
20

Boas respostas, já pensei em uma abordagem diferente que pode ou não funcionar para você.

Em vez de emitir chaves a serem incluídas, você pode exigir que o cabeçalho das solicitações inclua o nome do aplicativo front-end, a ser criado e formatado pelo desenvolvedor do aplicativo front-end, como fazem os navegadores da web. Dessa forma, os front-ends ainda poderiam fingir ser um aplicativo diferente, mas não haveria nenhum benefício em fazer isso, o que parece improvável. Apenas deixe o front-end se identificar e aceite qualquer string não vazia.

Martin Maat
fonte
Isso tornaria a vida um pouco mais difícil se a propriedade de um aplicativo fosse alterada - por exemplo, poderíamos apenas atualizar os detalhes da chave da API armazenados em nossa extremidade, mas se aceitarmos o texto em formato livre que exige que o aplicativo faça uma alteração no código.
Oli
11
@Oli Se a propriedade de um aplicativo fosse alterada e o (novo) desenvolvedor considerasse apropriado atualizar a identidade do aplicativo (o que realmente ocorre porque alguém a mantém), qual seria o problema? Você pode diferenciar entre alterações anteriores à propriedade e após alterações, apenas considere-as como dois aplicativos diferentes. Eu não esperaria que nenhum novo proprietário notasse o nome no cabeçalho tão cedo.
Martin Maat
3
Isto é o que eu faço. faça com que o cliente tenha um parâmetro de construção que seja o nome do aplicativo e / ou use a reflexão para puxar outras coisas, como a máquina em execução, a versão etc. O principal é permitir que você relate quando as pessoas NÃO estão seguindo sua API. policy
Ewan
11
Se a organização tem uma abordagem comum ao controle de versão, por exemplo, todos mantêm seu código no servidor GitHub da organização, cada aplicativo envia uma URL para seu repositório e o hash de confirmação a partir do qual foi construído. O hash de confirmação pode ser incluído no código como parte do processo de compilação, portanto, não é necessário que os desenvolvedores atualizem nada. Ter o URL do repositório permite ver quem é o proprietário e obter confirmações específicas permitiria observar diferenças de comportamento entre as versões.
Caleb
@ Caleb Se as coisas fossem centralizadas assim, o OP provavelmente não teria esse problema. Pelo que entendi, os desenvolvedores de aplicativos front-end são muito anônimos para o OP, com formas particulares de desenvolvimento de software.
Martin Maat
16

Em resumo:

Primeiro: facilitação e benefícios; Se necessário: atrito e polícia.

Mais algumas palavras

Facilitação : primeiro, facilite para uma equipe obter uma nova chave de API. Por exemplo, adicione um lembrete nos procedimentos corporativos para o lançamento de novos projetos e ofereça um serviço fácil de usar para solicitar novas chaves, sem pedir justificativa.

Benefícios : faça com que o uso de uma chave de API seja um benefício para a equipe ou o proprietário do produto. Por exemplo, proponha algum feedback sobre o uso do aplicativo com base nessa chave.

Atrito : Dependendo do recurso principal, você pode criar atrito, por exemplo, se a chave estiver vinculada a um domínio definido por aplicativo de somme (por exemplo, reutilizar chaves não necessariamente daria acesso a todos os serviços desejados).

Policiamento : Finalmente, pode ser necessário prever algumas medidas de policiamento. Por exemplo, você pode monitorar o uso das funções da API pela tecla api e, após um determinado período, para estabelecer uma linha de base, consulta sobre o uso de partes da API que não é esperado em vista da linha de base. Ou, se isso não for realista, inclua nas listas de verificação corporativas de revisão de projetos a verificação de que uma chave válida foi usada.

Observação : talvez você precise ser muito claro sobre sua política de chave de API: uma nova versão principal exigiria sua própria chave de API? O que com um garfo ou se um aplicativo é dividido? e se outra equipe estiver no comando, etc ...

Christophe
fonte
6

Geralmente, a maneira mais fácil de fazer com que os desenvolvedores "façam a coisa certa" é facilitar a execução.

Para esse fim, sugiro a criação de uma página / site de emissão de chave de API. Na sua forma mais simples, pode ser apenas um login (idealmente vinculado ao AD / LDAP corporativo) e a página que apenas pede o nome do aplicativo e emite a chave.

No final do dia, você sempre pode revogar as chaves posteriormente, então tudo o que você realmente precisa é registrar quem (nome de usuário) solicitou a chave e o que (Nome do Aplicativo) eles querem fazer com ela - junto com as informações necessárias para revogue a chave mais tarde.

Você poderia fazer algo semelhante com um sistema de emissão de bilhetes, mas no final do dia é muito fácil copiar e colar uma chave de um aplicativo para outro, por isso deve ser muito fácil solicitar uma nova chave, para evitar erros. comportamento.

DavidT
fonte
1

Seja pro ativo.

Identifique possíveis desenvolvedores e dê a eles chaves de API exclusivas em um canal seguro, com antecedência. Forneça um meio fácil de solicitar novas chaves de API. Forneça um meio fácil de novas pessoas solicitarem novas chaves de API. Quando novos estagiários ou contratados ingressarem na equipe, forneça a eles um ticket do JIRA ou "Solicite uma chave de API" semelhante, com as etapas na descrição.

Acompanhe quais chaves de API foram usadas e quais não. Se Bob enviou tíquetes no projeto, mas não usou suas chaves de API, é provável que tenha emprestado as de outra pessoa.

Tenha o suporte da gerência. Não seja uma Nancy intrometida adotando regras que não importam. Literalmente convencer a Gerência de que é importante e, então, eles são os únicos a convencer o grupo de que é importante. Não trabalhe convencendo a todos.

E a sugestão mais irritante e propensa a tirania: esteja ciente do uso indevido e reprima no mesmo dia. A mesma hora é melhor. Não diga "Bad Naughty Developer", diga "Aqui estão as etapas adequadas". Se o fizerem repetidamente, desative a tecla mal utilizada. Isso incomoda tanto o participante como o que emprestou, e o participante dirá "Não, faça-o corretamente" no futuro. Evite desativar as chaves que estão em projetos ao vivo.

Christopher Hostage
fonte
1

Como podemos incentivar os desenvolvedores a não compartilhar chaves de API internamente?

  • Gere chaves como resultado do registro do aplicativo de autoatendimento .
  • Exija um ponto de contato antes que as chaves se tornem ativas.
  • E peça para eles não compartilharem. (Criar um termos de serviço e / ou dizer-lhes por que é melhor para eles não compartilhar.)

Você também deve implementar a limitação de taxa . Isso por si só poderia desencorajar o compartilhamento de chaves. Ele protege seu sistema em certa medida contra aplicativos abusivos. (E absolutamente maliciosos.) E garante que você seja informado de alguma forma antes de um aumento maciço no tráfego que pode ser reparado. (Dando tempo para aumentar a capacidade, espero!)

E, com limitação de taxa, quando um aplicativo exige um limite mais alto, ele abre o diálogo com o POC registrado para a chave. Você tem a oportunidade de perguntar se as chaves estão sendo compartilhadas, explicar por que isso é prejudicial e assim por diante, e pode oferecer chaves adicionais quando apropriado, em vez das alterações no limite de taxa solicitado. Etc.

svidgen
fonte
0

Uma maneira de fazer as coisas, especialmente se as equipes usarem um sistema de compilação compartilhado (ou pelo menos um suficientemente comum), é configurar um servidor interno que crie e emita chaves de API (com algumas informações básicas sobre o produto que o utiliza) ) Em seguida, use um script que pegue uma nova chave de API do servidor para cada compilação ou para cada atualização de versão. Deixe os desenvolvedores executarem o script para obter uma chave diferente para suas compilações locais também. (Sempre que possível, automatize isso como parte da compilação para que eles nem precisem pensar nisso.)

Isso permitiria dizer se havia algo em produção, controle de qualidade ou desenvolvimento, e em qual versão / construção os problemas foram iniciados.

Miral
fonte
0

A primeira e melhor coisa que você pode fazer é formatar as chaves para que elas incluam o nome do aplicativo em um formato de fácil leitura e não funcionem se você o alterar.

Se for óbvio quando as equipes estiverem usando a chave errada, eles tentarão não fazê-lo.

Em seguida, expire periodicamente as chaves. Você deve fazer isso de qualquer maneira e, quando uma chave estiver quase expirando, poderá enviar uma nova para a equipe que a possui. A equipe que usa uma chave será motivada para garantir que é a equipe que a possui, para que eles recebam a nova quando ela expirar.

Matt Timmermans
fonte
11
na prática, embora as chaves expiradas possam ser um grande obstáculo para o aplicativo adotado - posso ver os gerentes dizendo "fuggetaboutit", pois isso só será um problema mais tarde.
davidbak 12/09