1
resposta

Erro de violação ao subir a aplicação

Olá.

Estou tentando subir minha aplicação no GitHub, contudo, recebo uma informação dizendo que cometi uma violação de segurança por causa da apiKey do ChatGpt. Minha chave esta definida como uma variável de ambiente, portanto, ele não está "hardcoded" na minha aplicação. Vou explicar como implementei e ao final eu insiro o erro.

Tentei uma abordagem alternativa para buscar a chave do chatgpt. Em vez de usar System.getenv("OPENAI_APIKEY") como feito em aula, introduzi um comando para isso em application.properties da seguinte forma:

openai.api.key=${OPENAI_APIKEY}

Recupero o valor da chave na classe ScreenMatchApplication e a passo para a classe Principal (somente em ScreenMatchApplication consegui fazer com que o valor da chave seja associado a variável apiKey, pois em outras partes do código a chave fica null). ScreenMatchApplication está da seguinte forma:

@Value("${openai.api.key}")
private String apiKey;

 @Override
public void run(String... args) throws Exception {

Principal principal = new Principal(repositorio,apiKey);
principal.exibeMenu();

Em Principal, crio uma instância de ConsultaChatGPT passando a apiKey:

private ConsultaChatGPT chatGPT;

public Principal(SerieRepository repositorio,String apiKey) {
    this.repositorio = repositorio;
    this.chatGPT = new ConsultaChatGPT(apiKey);

}

Aqui está a minha versão de ConsultaChatGPT (que faz uso da biblioteca OpenAiChatModel da langchain4j):

public class ConsultaChatGPT {

    private String apiKey;

    public ConsultaChatGPT (String apiKey) {
        this.apiKey = apiKey;
    }

    public String obterTraducao(String texto) {

        //conexão ao chatgpt via langchain4j
        OpenAiChatModel model = OpenAiChatModel.withApiKey(apiKey);
        return model.generate("traduza para o português o texto: " + texto);

    }
}

Como podem ver, o valor da chave não está no codigo, mas apenas a variável apiKey que vai receber o valor da variável de ambiente OPENAI_APIKEY.

Ao tentar fazer o push desse código, obtenho o seguinte erro:

remote: error: GH013: Repository rule violations found for refs/heads/main.
remote:
remote: - GITHUB PUSH PROTECTION
remote:   —————————————————————————————————————————
remote:     Resolve the following violations before pushing again
remote:
remote:     - Push cannot contain secrets
remote:
remote:
remote:      (?) Learn how to resolve a blocked push
remote:      https://docs.github.com/code-security/secret-scanning/pushing-a-branch-blocked-by-push-protection
remote:
remote:
remote:       —— OpenAI API Key ————————————————————————————————————
remote:        locations:
remote:          - commit: omitido
remote:            path: src/main/java/br/com/TopFlix/service/ConsultaChatGPT.java:21
remote:
remote:        (?) To push, remove secret from commit(s) or follow this URL to allow the secret.
remote:        omitido
remote:
remote:
remote:
To https://github.com/jhonatanalves/TopFlix.git
 ! [remote rejected] main -> main (push declined due to repository rule violations)
 ! [remote rejected] main -> main (push declined due to repository rule violations)

Pesquisando sobre isso, obtive as seguintes respostas:

a) Gemini: embora você tenha definido a API Key como uma variável de ambiente (OPENAI_APIKEY) e não a tenha codificado diretamente no código, o GitHub ainda a identifica como um segredo potencial. Isso ocorre porque o valor da variável de ambiente pode ser acessado pelo código, o que representa um risco de segurança.

-> Mas porque isso é um risco de segurança? necessitamos que o valor seja acessado pelo código, assim como as demais variáveis de ambiente definidas em aula: DB_HOST, DB_NAME, .... -> Engraçado, que para essas variáveis o GitHub não está reclamando.

b) Luri: o GitHub, por segurança, bloqueia a subida de código que contém chaves de API, mesmo que elas estejam armazenadas em variáveis de ambiente. Isso é feito para evitar que essas chaves sejam expostas publicamente.

-> Não entendo como o valor da apiKey pode ser exposta publicamente, uma vez que o valor dela não está hardcoded. Me parece que se isso fosse verdade, os valores de DB_HOST, DB_NAME, ...., também podem ser vazados (e para elas não está havendo essa mesma preocupação).

Seria possível manter a minha abordagem e subir esse código de alguma forma? Porque essa preocupação está ocorrendo unicamente com apiKey sendo, assim como as demais, é uma variável de ambiente declarada em aplication.properties?

Obrigado!

1 resposta

Minha suspeita é mesmo que a chave não esteja visível no código atual, pode ser que ela tenha sido exposta em um commit anterior. Pois o GitHub também faz o controle de versões da aplicação. Então se você estava utilizando o git localmente, antes de subir no GitHub, realizando commits, essas informações também são enviadas junto com o código atual. Para ter certeza de que é isso mesmo, você pode criar um novo projeto vinculado à um novo repositório do GitHub, depois coloque apenas a versão final do código com a chave da API nas variáveis de ambiente e tente fazer o push para o gitHub novamente.