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 email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.