Samba + LDAP (PDC)

Эта статья является доработкой предыдущей статьи, в которой учтены недостатки и реализованы новые идеи. В этой статье будет рассмотрена настройка самбы в качестве главного контроллера домена с хранением всей служебной информации в LDAP.

Итак, приступим... ОС, на которой будут производиться все операции - FreeBSD 7.3. Предполагается, что система чистая, а если нет, то удалите старые пакеты :). Обновляем порты. Далее устанавливаем сервер LDAP, в качестве такого я выбрал OpenLDAP.

# cd /usr/ports/net/openldap24-server
# make install clean

Из предложенных опций я выбрал следующие:

  • FETCH
  • TCP_WRAPPERS
  • SEQMOD
  • SYNCPROV
  • DYNAMIC_BACKENDS

Поддержку Berkley DB я убрал, так как народу у меня немного, соответственно хранить все можно в текстовых файлах. Если планируется много пользователей, то лучше использовать Berkley DB, ибо это хранилище быстрее работает.

После установки лезем править конфиг /usr/local/etc/openldap/slapd.conf. У меня он выглядит так:

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include         /usr/local/etc/openldap/schema/core.schema

# Подключаем дополнительные схемы
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema
include         /usr/local/etc/openldap/schema/nis.schema
#include         /usr/local/etc/openldap/schema/samba.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral       ldap://root.openldap.org

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

# Подгружаем нужный модуль:
modulepath      /usr/local/libexec/openldap
# moduleload    back_bdb
# moduleload    back_hdb
moduleload      back_ldap

# Sample security restrictions
#       Require integrity protection (prevent hijacking)
#       Require 112-bit (3DES or better) encryption for updates
#       Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

# Sample access control policy:
#       Root DSE: allow anyone to read it
#       Subschema (sub)entry DSE: allow anyone to read it
#       Other DSEs:
#               Allow self write access
#               Allow authenticated users read access
#               Allow anonymous users to authenticate
#       Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read

# Указываем права доступа к данным
access to attrs=userPassword
               by self write
               by anonymous auth
               by * none

access to *
               by self write
               by users read
               by anonymous read
               by * none

#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

#######################################################################
# BDB database definitions
#######################################################################

# В этой опции указываем хранилище
database        ldif
suffix          "dc=srv-home,dc=local"
rootdn          "cn=root,dc=srv-home,dc=local"
# Пароль для главного пользователя.
# Генерируется командой slappasswd, вывод команды просто скопировать сюда.
# Дополнительно за информацией обращайтесь в ман - slappasswd(8) и slapd.conf(5).
rootpw          {SSHA}XguytGYPdcylFxV60TD7DwhRy9AXML95
# Здесь указываем папку, где будет располагаться база данных.
# Она должна быть создана перед запуском slapd.
# Рекомендуется установить на нее следующие права доступа - 700.
directory       /var/db/openldap-data

# Настройка ведения логов
logfile         /var/log/openldap.log
loglevel        256

Где взять файл samba.schema будет сказано далее в статье. Теперь добавим демон slapd в автозагрузку и попробуем запустить:

# echo 'slapd_enable="YES"' >> /etc/rc.conf
# echo "slapd_flags='-h \"ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://127.0.0.1/ ldap://192.168.7.250/\"'" >> /etc/rc.conf
# service slapd start

Если все прошло нормально, то у вас должно быть примерно следующее:

# sockstat -l | grep slapd
ldap     slapd      36521 6  stream /var/run/openldap/ldapi
ldap     slapd      36521 7  tcp4   127.0.0.1:389         *:*
ldap     slapd      36521 8  tcp4   192.168.7.250:389     *:*

Наполним лдап базовой информацией. Для этого нужно создать отдельный файл, внести в него нужную информацию и добавить командой ldapadd.

dn: dc=srv-home,dc=local
objectClass: dcObject
objectClass: organization
objectClass: top
dc: srv-home
o: srv-home

dn: cn=root,dc=srv-home,dc=local
objectClass: organizationalRole
cn: root

dn: ou=users,dc=srv-home,dc=local
objectClass: top
objectClass: organizationalUnit
ou: users

dn: ou=groups,dc=srv-home,dc=local
objectClass: top
objectClass: organizationalUnit
ou: groups

dn: ou=computers,dc=srv-home,dc=local
objectClass: top
objectClass: organizationalUnit
ou: computers

Сохраните этот текст например в файле main.ldif и добавляем данные:

# ldapadd -x -D "cn=root,dc=srv-home,dc=local" -W -f main.ldif
Successfully added...

С настройкой OpenLDAP пока закончили. Сейчас надо установить скрипты, которые облегчат управление пользователями в лдапе и NSS модуль, который будет сопоставлять имя пользователя и идентификатор.
Со скриптами все просто, идем сюда - /usr/ports/net/ldapscripts и устанавливаем. А теперь надо подправить чуток конфиг /usr/local/etc/ldapscripts/ldapscripts.conf.

# LDAP Configuration
SERVER="ldap://localhost"
BINDDN="cn=root,dc=srv-home,dc=local"
# The following file contains the raw password of the binddn
# Create it with something like : echo -n 'secret' > $BINDPWDFILE
# WARNING !!!! Be careful not to make this file world-readable
#BINDPWDFILE="/usr/local/etc/ldapscripts/ldapscripts.passwd"
# For older versions of OpenLDAP, it is still possible to use
# unsecure command-line passwords by defining the following option
# AND commenting the previous one (BINDPWDFILE takes precedence)
BINDPWD="*****"

SUFFIX="dc=srv-home,dc=local" # Global suffix
GSUFFIX="ou=groups"        # Groups ou (just under $SUFFIX)
USUFFIX="ou=users"         # Users ou (just under $SUFFIX)
MSUFFIX="ou=computers"      # Machines ou (just under $SUFFIX)

# Start with these IDs *if no entry found in LDAP*
GIDSTART="20000" # Group ID
UIDSTART="20000" # User ID
MIDSTART="30000" # Machine ID

# User properties
USHELL="/usr/sbin/nologin"
UHOMES="/mnt/media/home/%u"     # You may use %u for username here
CREATEHOMES="no"      # Create home directories and set rights ?
#HOMESKEL="/etc/skel"  # Directory where the skeleton files are located. Ignored if undefined or nonexistant.
HOMEPERMS="700"       # Default permissions for home directories

# User passwords generation
# Command-line used to generate a password for added users (you may use %u for username here)
# WARNING !!!! This is evaluated, everything specified here will be run !
# Special value "<ask />" will ask for a password interactively
#PASSWORDGEN="cat /dev/random | LC_ALL=C tr -dc 'a-zA-Z0-9' | head -c8"
PASSWORDGEN="head -c8 /dev/random | uuencode -m - | sed -n '2s|=*$||;2p' | sed -e 's|+||g' -e 's|/||g'"
#PASSWORDGEN="pwgen"
#PASSWORDGEN="echo changeme"
#PASSWORDGEN="echo %u"
#PASSWORDGEN="<ask />"

# User passwords recording
# you can keep trace of generated passwords setting PASSWORDFILE and RECORDPASSWORDS
# (useful when performing a massive creation / net rpc vampire)
# WARNING !!!! DO NOT FORGET TO DELETE THE GENERATED FILE WHEN DONE !
# WARNING !!!! DO NOT FORGET TO TURN OFF RECORDING WHEN DONE !
RECORDPASSWORDS="no"
PASSWORDFILE="/var/log/ldapscripts_passwd.log"

# Where to log
LOGFILE="/var/log/ldapscripts.log"

# Temporary folder
TMPDIR="/tmp"

# Various binaries used within the scripts
# Warning : they also use uuencode, date, grep, sed, cut, expr, which...
# Please check they are installed before using these scripts
# Note that many of them should come with your OS

# OpenLDAP client commands
LDAPSEARCHBIN="/usr/local/bin/ldapsearch"
LDAPADDBIN="/usr/local/bin/ldapadd"
LDAPDELETEBIN="/usr/local/bin/ldapdelete"
LDAPMODIFYBIN="/usr/local/bin/ldapmodify"
LDAPMODRDNBIN="/usr/local/bin/ldapmodrdn"
LDAPPASSWDBIN="/usr/local/bin/ldappasswd"

# Character set conversion : $ICONVCHAR  UTF-8
# Comment ICONVBIN to disable UTF-8 conversion
ICONVBIN="/usr/local/bin/iconv"
ICONVCHAR="KOI8-R"

# Base64 decoding
# Comment UUDECODEBIN to disable Base64 decoding
UUDECODEBIN="/usr/bin/uudecode"

# Getent command to use - choose the ones used
# on your system. Leave blank or comment for auto-guess.
# GNU/Linux
#GETENTPWCMD="getent passwd"
#GETENTGRCMD="getent group"
# FreeBSD
GETENTPWCMD="pw usershow"
GETENTGRCMD="pw groupshow"
# Auto
#GETENTPWCMD=""
#GETENTGRCMD=""

# You can specify custom LDIF templates here
# Leave empty to use default templates
# See *.template.sample for default templates
#GTEMPLATE="/path/to/ldapaddgroup.template"
#UTEMPLATE="/path/to/ldapadduser.template"
#MTEMPLATE="/path/to/ldapaddmachine.template"
GTEMPLATE=""
UTEMPLATE=""
MTEMPLATE=""

Теперь нужно установить NSS модуль, который будет сопоставлять имя пользователя и идентификатор.

# cd /usr/ports/net/nss_ldap
# make install clean

И снова правим конфиг.

# Your LDAP server. Must be resolvable without using LDAP.
# Multiple hosts may be specified, each separated by a
# space. How long nss_ldap takes to failover depends on
# whether your LDAP client library supports configurable
# network or connect timeouts (see bind_timelimit).
host 127.0.0.1

# The distinguished name of the search base.
base dc=srv-home,dc=local

# The LDAP version to use (defaults to 3
# if supported by client library)
ldap_version 3

# The port.
# Optional: default is 389.
port 389

# The search scope.
#scope sub
scope one
#scope base

# Reconnect policy:
#  hard_open: reconnect to DSA with exponential backoff if
#             opening connection failed
#  hard_init: reconnect to DSA with exponential backoff if
#             initializing connection failed
#  hard:      alias for hard_open
#  soft:      return immediately on server failure
bind_policy soft

# Connection policy:
#  persist:   DSA connections are kept open (default)
#  oneshot:   DSA connections destroyed after request
nss_connect_policy persist

# Use paged rseults
nss_paged_results yes

# RFC2307bis naming contexts
nss_base_passwd ou=users,dc=srv-home,dc=local?one
nss_base_passwd ou=computers,dc=srv-home,dc=local?one
nss_base_shadow ou=users,dc=srv-home,dc=local?one
nss_base_group          ou=groups,dc=srv-home,dc=local?one

После настройки модуля нужно сказать системе, что информацию о идентификаторах можно получать еще через него. Для этого правим файл - /etc/nsswitch.conf, точнее всего две строчки в нем.

group: files ldap
passwd: files ldap

Проверим работоспособность настроенной связки:

# ldapaddgroup testgroup
Successfully added group testgroup to LDAP
# ldapadduser testuser testgroup
Successfully added user testuser to LDAP
Successfully set password for user testuser
# lsldap
...
dn: cn=testgroup,ou=groups,dc=srv-home,dc=local
objectClass: posixGroup
cn: testgroup
gidNumber: 20016
description: Group account

dn: uid=testuser,ou=users,dc=srv-home,dc=local
objectClass: account
objectClass: posixAccount
cn: testuser
uid: testuser
uidNumber: 20004
gidNumber: 20016
homeDirectory: /mnt/media/home/testuser
loginShell: /usr/sbin/nologin
gecos: testuser
description: User account
userPassword:: e1NTSEF9RzVTakJBZjMyM1d6b2ZycWpUZ0hIRXhnak0vdnlTWCs=
...
# id testuser
uid=20004(testuser) gid=20016(testgroup) groups=20016(testgroup)

Если у вас в выводе команд наблюдается, что-то подобное, то все работает нормально. Удалить пользователя и группу можно командами - ldapdeleteuser и ldapdeletegroup.

Приступаем к установке и настройке самбы.

# cd /usr/ports/net/samba34
# make install clean

Опции, которые я выбрал:

  • LDAP
  • ACL_SUPPORT
  • QUOTAS
  • POPT

После завершения установки надо скопировать схему samba.schema в папку схем openldap:

# cp /usr/local/share/examples/samba34/LDAP/samba.schema /usr/local/etc/openldap/schema

Теперь раскомментируем строку в файле slapd.conf, где подключается только что скопированная схема и перезапускаем демон slapd. Ну и идем править конфиг самбы.

#======================= Global Settings =====================================
[global]
  workgroup = HOME
  server string = Documents
  netbios name = srv-home.local

  security = user
  hosts allow = 192.168.7. 127.
  load printers = no
  printing = bsd
  #guest account = nobody
  #log file = /var/log/samba34/log.%m
  log file = /dev/null
  log level = 0
  max log size = 5000
  encrypt passwords = yes
  #passdb backend = tdbsam
  passdb backend = ldapsam:ldap://localhost/
  ldap suffix = dc=srv-home,dc=local
  ldap user suffix = ou=users
  ldap group suffix = ou=groups
  ldap machine suffix = ou=computers
  ldap admin dn = "cn=root,dc=srv-home,dc=local"
  ldap delete dn = no
  ldap ssl = no

  ;include = /usr/local/etc/smb.conf.%m

  read raw = yes
  write raw = yes
  use sendfile = yes
  socket options = IPTOS_LOWDELAY TCP_NODELAY SO_SNDBUF=32768 SO_RCVBUF=32768 SO_KEEPALIVE

  interfaces = 192.168.7.250/24 127.0.0.1/8
  bind interfaces only = yes
  local master = yes
  domain master = yes
  preferred master = yes

  os level = 65
  domain logons = yes
  wins support = yes
  time server = yes

  admin users = nekit
  logon path = \\%L\profiles\%U
  logon drive = H:
  logon home = \\%L\%U
  logon script = logon.cmd

  display charset = koi8-r
  unix charset = koi8-r
  dos charset = cp866

  case sensitive = no

  store dos attributes = yes

# Скрипт, для добавления машин
  add machine script = /usr/local/sbin/ldapaddmachine '%u' smb_pdc_computers
  add user script = /usr/local/sbin/ldapadduser '%u' smb_pdc_users
  add group script = /usr/local/sbin/ldapaddgroup '%g'
  add user to group script = /usr/local/sbin/ldapaddusertogroup '%u' '%g'
  delete user script = /usr/local/sbin/ldapdeleteuser '%u'
  delete group script = /usr/local/sbin/ldapdeletegroup '%g'
  delete user from group script = /usr/local/sbin/ldapdeleteuserfromgroup '%u' '%g'
  set primary group script = /usr/local/sbin/ldapsetprimarygroup '%u' '%g'
  rename user script = /usr/local/sbin/ldaprenameuser '%uold' '%unew'

#============================ Share Definitions ==============================
[netlogon]
  comment = Netlogon Service
  path = /mnt/media/samba/netlogon
  read only = yes
  browseable = no
  public = no

[profiles]
  comment = User profiles
  path = /mnt/media/samba/profiles
  writeable = yes
  browseable = no
  public = no
  csc policy = disable
  create mask = 0600
  directory mask = 0700

[homes]
  comment = Home Directories
  browseable = no
  writable = yes
  force create mode = 0640
  force directory mode = 0750

# NOTE: If you have a BSD-style print system there is no need to
# specifically define each individual printer
[printers]
  comment = All Printers
  path = /var/spool/samba
  browseable = no
# Set public = yes to allow user 'guest account' to print
  guest ok = no
  writable = no
  printable = yes

[Video]
  comment = Video
  path = /mnt/media/samba/video
  browseable = yes
  public = no
  writable = yes
  force create mode  = 0640
  force directory mode = 0750
  create mask = 0640
  directory mask = 0750
  force user = root
  force group = wheel
  valid users = @smb_video_read, @smb_video_write
  write list = @smb_video_write
  read list = @smb_video_read, @smb_video_write

[Music]
  comment = Music
  path = /mnt/media/samba/music
  browseable = yes
  public = no
  writable = yes
  force create mode = 0640
  force directory mode = 0750
  create mask = 0640
  directory mask = 0750
  force user = root
  force group = wheel
  valid users = @smb_music_read, @smb_music_write
  write list = @smb_music_write
  read list = @smb_music_read, @smb_music_write

[Distrib]
  comment = Distrib
  path = /mnt/media/samba/distrib
  browseable = yes
  public = no
  writable = yes
  force create mode = 0640
  force directory mode = 0750
  create mask = 0640
  directory mask = 0750
  force user = root
  force group = wheel
  valid users = @smb_distrib_read, @smb_distrib_write
  write list = @smb_distrib_write
  read list = @smb_distrib_read, @smb_distrib_write

[Wallpapers]
  comment = Wallpapers
  path = /mnt/media/samba/wallpapers
  browseable = yes
  public = no
  writable = yes
  force create mode = 0640
  force directory mode = 0750
  create mask = 0640
  directory mask = 0750
  force user = root
  force group = wheel
  valid users = @smb_wallpapers_read, @smb_wallpapers_write
  write list = @smb_wallpapers_write
  read list = @smb_wallpapers_read, @smb_wallpapers_write

Теперь нужно сказать пароль самбе от главного пользователя лдапа:

# smbpasswd -W
Enter password: ***
Retype enter password: ***

Добавляем самбу в автозагрузку и запускаем.

# echo 'smbd_enable="YES"' >> /etc/rc.conf
# echo 'nmbd_enable="YES"' >> /etc/rc.conf
# service samba start

Проверим, запустилась ли samba:

# sockstat | grep -E "smbd|nmbd"
root     smbd       18247 10 tcp4   192.168.7.250:139     192.168.7.101:2386
root     smbd       18247 21 tcp4   127.0.0.1:61042       127.0.0.1:389
root     smbd       18247 25 tcp4   127.0.0.1:62217       127.0.0.1:389
root     smbd       92555 21 tcp4   127.0.0.1:63357       127.0.0.1:389
root     smbd       92553 21 tcp4   127.0.0.1:63357       127.0.0.1:389
root     smbd       92553 22 tcp4   127.0.0.1:445         *:*
root     smbd       92553 23 tcp4   127.0.0.1:139         *:*
root     smbd       92553 24 tcp4   192.168.7.250:445     *:*
root     smbd       92553 25 tcp4   192.168.7.250:139     *:*
root     nmbd       92548 11 udp4   *:137                 *:*
root     nmbd       92548 12 udp4   *:138                 *:*
root     nmbd       92548 13 udp4   192.168.7.250:137     *:*
root     nmbd       92548 14 udp4   192.168.7.250:138     *:*

Если на экране вы видите что-то подобное, то запуск самбы прошел успешно.
Создаем группы в системе, которым будут сопоставляться группы Windows.

# ldapaddgroup smb_pdc_admins
# ldapaddgroup smb_pdc_users
# ldapaddgroup smb_pdc_computers
# ldapaddgroup smb_pdc_guests

Далее нужно сопоставить группы винды группам системы:

# net groupmap add rid=512 unixgroup=smb_pdc_admins type=d ntgroup="Domain Admins"
# net groupmap add rid=513 unixgroup=smb_pdc_users type=domain ntgroup="Domain Users"
# net groupmap add rid=514 unixgroup=smb_pdc_guests type=domain ntgroup="Domain Guests"
# net groupmap add rid=515 unixgroup=smb_pdc_computers type=domain ntgroup="Domain Computers"

Посмотрим, что получилось:

# net groupmap list
Domain Admins (S-1-5-21-2073026716-1291088168-25512215-512) -> smb_pdc_admins
Domain Users (S-1-5-21-2073026716-1291088168-25512215-513) -> smb_pdc_users
Domain Computers (S-1-5-21-2073026716-1291088168-25512215-515) -> smb_pdc_computers
Domain Guests (S-1-5-21-2073026716-1291088168-25512215-514) -> smb_pdc_guests

Для разграничения прав к шарам я указал группы, которым разрешены либо чтение, либо запись. Их тоже нужно создать и сопоставить им виндовые группы:

# ldapaddgroup smb_video_read
# ldapaddgroup smb_video_write
# ldapaddgroup smb_music_read
# ldapaddgroup smb_music_write
# ldapaddgroup smb_distrib_read
# ldapaddgroup smb_distrib_write
# ldapaddgroup smb_wallpapers_read
# ldapaddgroup smb_wallpapers_write

# net groupmap add unixgroup=smb_video_read type=local ntgroup="Video Share Read"
# net groupmap add unixgroup=smb_video_write type=local ntgroup="Video Share Write"
# net groupmap add unixgroup=smb_music_read type=local ntgroup="Music Share Read"
# net groupmap add unixgroup=smb_music_write type=local ntgroup="Music Share Write"
# net groupmap add unixgroup=smb_distrib_read type=local ntgroup="Distrib Share Read"
# net groupmap add unixgroup=smb_distrib_write type=local ntgroup="Distrib Share Write"
# net groupmap add unixgroup=smb_wallpapers_read type=local ntgroup="Wallpapers Share Read"
# net groupmap add unixgroup=smb_wallpapers_write type=local ntgroup="Wallpapers Share Write"

Создаем администратора домена:

# ldapadduser nekit smb_pdc_admins
# smbpasswd -a nekit
New password: ***
Retype password: ***

Еще нужно дать группе или пользователю права на включение машин в домен и другие:

# net rpc rights grant "Domain Admins" SeMachineAccountPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeTakeOwnershipPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeBackupPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeRestorePrivilege -U nekit
# net rpc rights grant "Domain Admins" SeRemoteShutdownPrivilege -U nekit
# net rpc rights grant "Domain Admins" SePrintOperatorPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeAddUsersPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeDiskOperatorPrivilege -U nekit

В принципе настройка контроллера домена закончена и можно включать компы в него. Для удобства администрирования пользователями и компами в домене NT4 есть утилиты от мелкософта srvtools. Так же если вы будете назначать групповые политики через файл NTconfig.pol, то понадобится тулза poledit и шаблоны для определенной версии винды (Windows 2000, Windows XP). Все утилиты были взяты из дистра винды NT4, а шаблоны берутся из серверной винды. На этом все, пользуемся...

Андрей А (не проверено)

Не будет у вас ничего работать, если сделаете по этой статье. В slapd.conf есть строчка "database        ldif". Т.е. подразумевается, что должна быть база, но автор не написал- на каком этапе она создается. Т.е. Лдап у вас просто не запустится, а значит, толку от статьи- ноль.

Дело в том, что вы видимо не понимаете как работает лдап. В статье указано как и чем наполняется свежеустановленный лдап сервер. Директива database используется для определения формата базы данных, а не пути расположения наполненной базы. Читайте внимательнее статью и документацию.

Может быть. Но вот я дошел до заполнения базы, ввожу ldapadd -x -D "cn=root,dc=srv-home,dc=local" -W -f main.ldif , ввожу пароль рута и мне пишет: ldap_bind: Invalid credentials (49) . Значит, все-таки где-то ошибка..

Данная ошибка говорит о том, что указан неверный логин или пароль. Перепроверьте этап задания пароля, может опечатались или неправильно его задали.

Гость (не проверено)

I really enjoy good wine. Whether it's red or white, it’s the perfect way to relax.





Are there any wine lovers around? #WineTasting





Feel free to surf to my website; ขายไวน์

Гость (не проверено)

I really enjoly good vintage wine. From a local vineyard or imported, it just elevates any occasion. Are there any wine


lovers around? #RedWine





my webpage: ไวน์ขาว - https://Icskorea.Co.kr/bbs/board.php?bo_table=free&wr_id=456313

Гость (не проверено)

Can't get enough of good vintage wine. Doesn’t


matter if it’s dry oor sweet, it just elevates anyy occasion. Who else enjoys wine tasting?


#RedWine





my site: Tina

Добавить комментарий

CAPTCHA
Любой из поддерживаемых протоколов.
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.

Последние комментарии

Яндекс.Метрика