RMI og sikkerhed er noget af det mest irriterende at arbejde med. Man skal tillade alt RMI foretager sig udover localhost, dette være sig tilslutte, modtage forbindelser, modtage og sende.
Jeg har prøvet at åbne for kun de nødvendige funktioner, hvilket viste sig ikke at virke. En exception blev smidt hvor jeg fik at vide, at det krævede tilladelse til connecte til et RMI-register på en anden maskine end localhost. Dette gjorde gav jeg så tilladelse til, men virke gjorde det stadig ikke. Den eneste måde jeg har fået det til at virke på uden besvær er at give tilladelse til alt. Hvis du sidder og bare skal have skidtet til at virke uden for megen besvær, kan du gøre som beskrevet nedenfor, dog skal du være opmærksom på at al sikkerhed er slået fra. Hvis du sørger for at lukke de porte RMI-registrene anvender med mod internettet firewall eller router, skulle de værste sikkerhedsproblemer være overkommet.
Du opretter en fil (simpel tekst-fil) med navnet 'rmi.policy' med følgende indhold:
grant { permission java.security.AllPermission; };
Det første du gør i main-metoden på både klient- og server-siden som arne beskriver er at sætte en SecurityManager:
Security er nødvendigt, hvis du kontrollere hvem der har adgang til din RMI service.
Security er nødvendig, hvis du vil beskytte dig mod ondsindet kode.
Lad os sige at du får denne lille fikse RMI klient som du kan installere på din PC og få seneste sports nyheder vist løbende. Samtidigt læse klienten lige alle dine filer på din harddisk og sender dem til serveren. Ups. Derfor skal man eksplicit grante den adgang som man nu tør give applikationen.
Det kan det sikkert også, men hvis nu bare det skal virke uden besvær, så er det løsningen. RMI er fyldt med udokumenterede begræsninger, og derfor kan man let komme til at sidde fast i et problem. To eksempler er:
1. Det er kun muligt at have ét RMI-register startet i samme JVM, man kan altså ikke i samme applikation binde to registre til hver deres port. 2. Det er ikke muligt at binde eller unbinde objeker i registre andre steder end på localhost, man kan altså kunne binde sine Remote's i et RMI-register kørende på localhost.
Er det korrekt forstået, at det stor i security i RMI, går på at give den bruger der skal anvende klient delen, muligheden for at grante permisions han synes han tør grante.
Umiddelbart vil jeg sige at til interne løsninger behøver man ikke sig så meget om det security og at til eksterne løsninger vil jeg idag anbefale web service fremfor RMI. Men de var ikke opfundet da RMI blev designet.
Det handler nu især også om at beskytte din server. Mest af alt er det jo klienten der kalder metoder på objekter serveren har bundet. Klienten skal bare sørge for at få åbnet præcis de nødvendige tilladelser for at kunne connecte til serveren og udføre de ønskede funktioner. For serveren gælder det om at være tilstrækkelig beskyttet mod afvikling af ondsindet. Hvis serveren udvikles ud fra et princip om at den ikke kalder metoder på klienten, men kun at klienten kalder metoder på serveren, burde du være nogenlunde sikker.
Som nævnt er det ikke muligt for klienter at ændre i serverens RMI-register, hvorfor det ikke just er let at afvikle ondsindet kode. Noget andet der kunne hjælpe sikkerheden var at binde RMI-registeret til en anden port end default rmi-porten 1099, og i stedet til f.eks. 1100 eller 10000 for den sags skyld. Det gør at eventuelle hackere ikke kan regne ud, at det er et RMI-register der kører på den givne port.
En sidste spørgsmål for at være sikker på, jeg har forstået princippet: Når server og klient delen udvikles, sørger man for at lave én policy fil, der fortæller, hvilke operationer der må udføres på klienten, samt hvilke klienter der må opret forbindelse til serveren.
Du skal vel bruge en polizy-fil til henholdsvis klienten og serveren. Hvis du har en firewall, kan du gøre præcis det samme med den, som hvis du sætter begrænsningerne i en policy-fil.
Normalt vil der være forskellig policy fil på client og server fordi der kræves forskellig permissions.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.