Kolekcje tylko do odczytu

Zastanawialiście się kiedyś w jaki sposób zapobiec przypadkowym modyfikacjom kolekcji przez aplikację korzystającą z Solr, bądź przez osobę mającą dostęp do Solr? Oczywiście możemy zabrać dostęp i jest to jedno z rozwiązań, aczkolwiek nie zawsze jest to możliwe. W dzisiejszym wpisie dowiemy się w jaki sposób możliwe jest zabezpieczenie kolekcji przed zapisem dzięki konfiguracji kolekcji w trybie tylko do odczytu.

Zachowanie domyślne

W przypadku kiedy tworzymy naszą kolekcję, czy to za pomocą API, czy skryptu bin/solr jest ona tworzona w trybie umożliwiającym zarówno zapis, jak i odczyt. Stwórzmy sobie zatem kolekcję za pomocą następującego polecenia:

$ bin/solr create_collection -c readonly

Działamy w oparciu o Solr 8.2, a zatem powyższe polecenie wykorzysta konfigurację o nazwie _default domyślnie dostarczaną wraz z SolrCloud. Pozwoli to nam na wysłanie prostego dokumentu za pomocą poniższego polecenia:

$ curl -XPOST -H 'Content-Type:application/json' 'http://localhost:8983/solr/readonly/update' -d '[
{
"id" : 1,
"name" : "Test document"
}
]'

Oczywiście odpowiedź Solr w tym wypadku sugeruje nam, iż indeksowanie odbyło się bez żadnych niespodzianek, a dokument został przetworzony i zaindeksowany poprawnie:

{
"responseHeader":{
"rf":1,
"status":0,
"QTime":168}}

Kolekcja tylko do odczytu

Jeżeli chcielibyśmy, aby nasza kolekcja została oznaczona jako tylko do odczytu, a zatem, aby jej modyfikacje nie były możliwe, należy ustawić atrybut kolekcji readOnly na wartość true. W tym celu korzystamy z następującego wywołania Collections API:

$ curl -XGET 'localhost:8983/solr/admin/collections?action=MODIFYCOLLECTION&collection=readonly&readOnly=true'

Odpowiedź Solr powinna wyglądać mniej, więcej tak:

{
"responseHeader":{
"status":0,
"QTime":846},
"success":{
"192.168.0.20:8983_solr":{
"responseHeader":{
"status":0,
"QTime":724}}}}

Możemy zatem testować, czy na pewno nasza kolekcja jest tylko do odczytu.

Zacznijmy od prostego indeksowania:

$ curl -XPOST -H 'Content-Type:application/json' 'http://localhost:8983/solr/readonly/update' -d '[
{
"id" : 2,
"name" : "Second test document"
}
]'

W odpowiedzi Solr zwraca nam błąd:

{
"responseHeader":{
"status":403,
"QTime":1},
"error":{
"metadata":[
"error-class","org.apache.solr.common.SolrException",
"root-error-class","org.apache.solr.common.SolrException"],
"msg":"Collection readonly is read-only.",
"code":403}}

A co, jeżeli spróbujemy skorzystać z Schema API, np. w celu dodania nowego pola? Możemy to sprawdzić wykorzystując następujące polecenie:

$ curl -XPOST -H 'Content-type:application/json' 'http://localhost:8983/solr/readonly/schema' --data-binary '{
"add-field" : {
"name" : "test",
"type" : "string",
"stored" : true,
"indexed" : true
}
}'

W tym wypadku operacja udała się:

{
"responseHeader":{
"status":0,
"QTime":479}}

Umożliwienie modyfikacji

W celu ponownego umożliwienia indeksowania danych wystarczy ponownie korzystać z Collections API ustawiając atrybut readOnly kolekcji na wartość false:

$ curl -XGET 'localhost:8983/solr/admin/collections?action=MODIFYCOLLECTION&collection=readonly&readOnly=false'

Podsumowanie

Jak pokazuje powyższy przykład, wraz z Solr 8.1, dostaliśmy prostą, aczkolwiek skuteczną metodę ochrony kolekcji przed modyfikacją dokumentów w niej zawartych. Jeżeli nasza aplikacja korzysta z kolekcji, które mogą być oznaczone, jako tylko do odczytu, to warto się nad tym zastanowić. Może nam to oszczędzić potencjalnych problemów w przypadku błędów naszej aplikacji. Wraz z możliwościami autoryzacji i autentykacji w SolrCloud, możemy również ograniczyć dostęp do Collections API, a tym samym ograniczyć możliwość ponownego włączenia zapisu do kolekcji dojąc kolejny poziom zabezpieczeń.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

We use cookies to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners. View more
Cookies settings
Accept
Privacy & Cookie policy
Privacy & Cookies policy
Cookie name Active
Save settings
Cookies settings