LINUX.ORG.RU
ФорумAdmin

cassandra и аутентификация нод в кластере

 


0

2

Между нодами в кластере cassandra можно построить TLS. Но хотелось бы просто запретить входить в кластер cassandra левым хостам (iptables не подходит, рутовых прав на хостах нет). В cassandra,yaml есть такое:

# Internode authentication backend, implementing IInternodeAuthenticator;
# used to allow/disallow connections from peer nodes.
# internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator
Как этим пользоваться? Как должна выглядеть конфигурация для запрета всего, кроме... Идеально бы было, если бы задавалось что-то похожее на shared secret, но и разрешительный список IP-адресов то же подойдёт.


Я не понял как этим пользоваться. Использую TLS с аутентификацией обоих сторон.

maxcom ★★★★★
()

Там только указанная реализация имеется, которая разрешает всех. Если нужен «белый» список адресов, то необходимо писать свою реализацию.

Что-то вроде этого:

package org.example.cassandra.auth;

import org.apache.cassandra.auth.IInternodeAuthenticator;
import org.apache.cassandra.exceptions.ConfigurationException;

import java.io.UncheckedIOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.file.Files;
import java.util.Objects;
import java.util.stream.Collectors;

public final class WhiteListAuthenticator
    implements IInternodeAuthenticator
{
    private static final File CONFIG_FILE = new File("/etc/cassandra/internode_whitelist");

    private final Set<InetAddress> allowed;

    public WhiteListAuthenticator()
    {
        try {
            allowed = Files.readAllLines(CONFIG_FILE.toPath())
                .stream()
                .map(line -> {
                    try {
                        return InetAddress.getByName(line);
                    }
                    catch (UnknownHostException e) {
                        throw new RuntimeException(e);
                    }
                })
                .collect(Collectors.toSet());
        }
        catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    @Override
    public boolean authenticate(InetAddress remoteAddress, int remotePort)
    {
        Objects.requireNonNull(remoteAddress, "null_remote_address");

        return allowed.contains(remoteAddress);
    }

    @Override
    void validateConfiguration()
        throws ConfigurationException
    {
        // No-op.
    }
}


И после компиляции подсунуть так, чтобы Cassandra его могла видеть. Дальше останется только прописать:
internode_authenticator: org.example.cassandra.auth.WhiteListAuthenticator

Ну и указать список адресов в /etc/cassandra/internode_whitelist.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.