tombstone.md


AD Tombstone

AD Recycle Bin оно же Tombstone позволяет перемещать объекты LDAP во временное хранилище. Этот функционал является составной частью домена начиная с 2008R2 и затрагивает разные части кода:

  • source4/dsdb/samdb/ldb_modules/tombstone_reanimate.c

В source4/rpc_server/drsuapi/getncchanges.c присутствует интересная заметка, которая немного объясняет ситуацию:

On Windows 2008R2 isRecycled is always present even if FL or DL are < FL 2K8R2
if it join an existing domain with deleted objets, it firsts impose to have a
schema with the is-Recycled object and for all deleted objects it adds the isRecycled
either during initial replication or after the getNCChanges.
Behavior of samba has been changed to always have this attribute if it's present in the schema.

So if FL <2K8R2 isRecycled might be here or not but we don't care, it's meaning less.
If FL >=2K8R2 we are sure that this attribute will be here.
For this kind of forest level we do not return the link if the object is recycled
(isRecycled = true).

То есть isRecycled должно быть частью схемы, что также присутствует в нижеследующих ссылках:

  • source4/setup/ad-schema/Classes_for_AD_DS__Windows_Server_2008_R2.ldf
  • source4/setup/ad-schema/MS-AD_Schema_2K8_R2_Attributes.txt
  • source4/setup/ad-schema/AD_DS_Attributes__Windows_Server_2016.ldf
  • source4/setup/ad-schema/AD_DS_Classes__Windows_Server_v1803.ldf
  • source4/setup/ad-schema/Classes_for_AD_DS__Windows_Server_2012.ldf
  • source4/setup/ad-schema/AD_DS_Attributes__Windows_Server_v1803.ldf
  • source4/setup/ad-schema/MS-AD_Schema_2K8_R2_Classes.txt
  • source4/setup/ad-schema/Attributes_for_AD_DS__Windows_Server_2008_R2.ldf
  • source4/setup/ad-schema/AD_DS_Classes_Windows_Server_v1903.ldf
  • source4/setup/ad-schema/AD_DS_Classes__Windows_Server_2012_R2.ldf
  • source4/setup/ad-schema/Attributes_for_AD_DS__Windows_Server_2012.ldf
  • source4/setup/ad-schema/AD_DS_Attributes_Windows_Server_v1903.ldf
  • source4/setup/ad-schema/AD_DS_Attributes__Windows_Server_2012_R2.ldf
  • source4/setup/ad-schema/AD_DS_Classes__Windows_Server_2016.ldf
  • source4/setup/adprep/WindowsServerDocs/Schema-Updates.md

Присутствует в тесте базы данных: python/samba/dbchecker.py:2164

Тесты в source4/torture/drs/python/repl_move.py как раз проверяют функционирование репликации удаления объектов между DC1 и DC2. Проблему можно было бы начать искать с запуска этих тестов.

Интерес представляет фнукция source4/dsdb/samdb/ldb_modules/repl_meta_data.c:4292:4959

/*
  handle update of replication meta data for deletion of objects

  This also handles the mapping of delete to a rename operation
  to allow deletes to be replicated.

  It also handles the incoming deleted objects, to ensure they are
  fully deleted here.  In that case re_delete is true, and we do not
  use this as a signal to change the deleted state, just reinforce it.

 */
static int replmd_delete_internals(struct ldb_module *module, struct ldb_request *req, bool re_delete)

которая отвечает за репликацию свойств, в том числе и isRecycled/isDeleted. Я бы предположил, что неполадки надо искать в ней и в ответной части.

Присутствует в описании RPC в части DRS: librpc/idl/drsuapi.idl, там передаётся информация о том, включена ли функция “Recycle Bin” согласно https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/3ee529b1-23db-4996-948a-042f04998e91 [MS-DRSR] DRS_EXTENSIONS_INT.

Тесты на работоспособность удаления объектов: source4/dsdb/tests/python/deletetest.py

Представляющие слабый интерес части

  • source4/dsdb/samdb/ldb_modules/acl_read.c
  • python/samba/netcmd/user.py
  • source4/dsdb/samdb/ldb_modules/show_deleted.c

Вывод

Функционал Recycle Bin является частью основной системы, имеет поддержку на уровне схемы, базы данных и DRSUAPI (и механизма репликации вообще) и покрыт тестами на Python.

Начать отладку можно было бы с запуска тестов на машинах с проблемной конфигурацией.