Search
Write a publication
Pull to refresh
7
0

Пользователь

Send message

https://team.vk.company/vacancy/21231/

Возникала ли необходимость инвалидации кеша, отдельных файлов?

> Incron зациклился

я про это и говорил

> и лучше всего триггер вешать на один файл.
>… касание файлу-маркеру.

если развернуть эту мысль (псевдокод, возможны ошибки):

# incron
${REPO}/x86_64  IN_CLOSE_WRITE,IN_DELETE /usr/bin/touch /tmp/need_create
${REPO}/SRPMS  IN_CLOSE_WRITE,IN_DELETE /usr/bin/touch /tmp/need_create


# crontab
SHELL=/bin/bash
REPO=/var/www/repos/repo
* * * * * repouser  [  /tmp/need_create -nt /tmp/last_create ] && flock  -xn /tmp/createrepo.lock -c "cp -a /tmp/need_create /tmp/last_create; /usr/bin/createrepo --update ${REPO};"

как-то так

UPD: ну, а вообще, если загружаемый файл изменяется после загрузки, т.е есть `rpmsign` перед `createrepo`, то правильнее загружать файл в отдельную папку… и после подписи складывать в нужное место.
ваш github.com/slytomcat/URLshortener/blob/dev/docker-compose.yml завелся без особых проблем. Ищите проблему у себя в хосте, или компоуз файле. Может быть на хоcте что-то уже висит на 8080, или не хватает `ports: — 8080:8080`. или в ./cnfr.json не 8080 порт))))
нужно больше информации, сделайте минимальный пример из двух файлов app.go и Dockerfile

Думаете json темплейт для пакера будет короче? Вангую, что будет минимум в 3 раза больше по количеству строк

У меня мнение совсем не скромное. Мы должны, обязаны, понимать как работают инструменты, которыми пользуемся.
Что такое в пакер билдере amazon-ebssurrogate я знаю.

Имхо, как-то все переусложнено у вас, скриптами, бесконечными циклами… пакетами в репозитории.


yum install incron -y
echo root > /etc/incron.allow
echo "${REPO}  IN_CLOSE_WRITE,IN_DELETE /usr/bin/createrepo --update "${REPO}" > /var/spool/incron/root
systemctl restart incrond

profit?


Понятно, что всякие условия гонки могут возникать… и лучше всего триггер вешать на один файл.
Но это уже можно дать на откуп автоматизации. Если что-то билдит и заливает десятки файлов, то ничего не стоит сделать одно касание файлу-маркеру.

Быстрейшим способом очистить такую директорию является rsync с пустой директорией.
А rm * подвесит вам шелл. Если рсинка под рукой нет я бы попробовал find -delete или даже "rm -r .".

Нет, rsync не является быстрейшим.
unlink perl-a быстре, на выбор:


perl -e 'for(<*>){((stat)[9]<(unlink))}'
perl -e 'chdir "/var/spool/exim/msglog/" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'

истоки

Например одному приложению нужен PHP 4.х

Серьёзно, такие ещё есть?) Я понимаю, что пример с потолка, но всё равно странно требование старой версии софта, тем более настолько.

4.х не знаю, а 5.2.17 есть ((((

а еще, можно писать кастомные фильтры, под каждый чих)

Посмотрел, да. Не убедительно.


  1. в EPEL есть libmodsecurity-devel-3.0.2, это ваш раздел номер 3, ничего собирать не надо.


  2. вот официальная вика https://github.com/SpiderLabs/ModSecurity/wiki
    в том числе



  3. "Nginx Connector" тоже имеет вику, которая приводит нас сюда https://www.getpagespeed.com/server-setup/nginx/install-modsecurity-nginx-module-on-centos-7 откуда легко получить и spec для сборки своего, или готовые пакеты, двухмесячной давности:



nginx-module-security-1.14.2.1.0.0-1.el7_4.gps.x86_64.rpm   24.0 KiB    2018-Dec-07 00:14

п.с. c openssl-1.1.1 у меня не собралось, придется багрепортить.

"проблема" в том, что это хабр, или мне бы хотелось, что бы это оставалось Хабром… хотелось бы верить, что аудитория сама может открыть гитхаб и прочитать configure && make && make install, а в статьях будет что-то новое.
В любом случае, make install — единственный минус.
Спасибо, я обязательно попробую modsecurity )

шел 2019 год… yum install gcc gcc-c++ && make install) сборочный мусор на рабочих серверах)))
почему нельзя просто написать nginx-modsecurity.spec,
отправить его в https://copr.fedorainfracloud.org/,
и через 10 имнут получить свой репозиторий со своим динамическим модулем modsecurity?
Статья короткая получится, точно!!

По теме минимизации размеров, забыли самое главное. Это scratch образы.
И в этом деле лучше всего проявляются особеннности Golang, где размер образа равен размеру бинарника.


FROM golang:alpine as go_builder
COPY app  /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM scratch
COPY --from=go_builder /app .
ENTRYPOINT ["/app"]

Итак, что бы проксировать http(s) в localhost:8080 вы выбрали такой путь:
Nginx, возможно даже из сторонних репозиториев, конфиги, установка sertbot и какие-то там подтверждения соглашений, ручные правки, кроны…
Предлагаю заменить этот паровоз на два элемента systemd+traefik. Без каких-либо ручных правок файлов.
Алгоритм автоматизации:


  • скопировать юнит-файл
  • скопировать бинарник traefik
  • cкопировать конфиг traefik
  • установка вашего или любого другого сервиса на local host:8080 ( кстати, а почему не на сокете?)
  • настройка fw
  • reboot

Да, этот кусок, тоже, пример плохого тона, и вспоминается вот этот заголовок:


- name: List /etc/sudoers.*~ files
  shell: "ls -t /etc/sudoers*~ |tail -n +4"
  register: LIST_SUDOERS
  changed_when: false

- name: Cleanup /etc/sudoers.*~ files
  file:
    path: "{{ item }}"
    state: absent
  loop: "{{ LIST_SUDOERS.stdout_lines }}"
  when: LIST_SUDOERS.stdout_lines != ""

Но, и это можно красиво переписать ансиблом:


    - find: path="/etc" patterns="sudoers*"
      register: files

    - file:
        path: "{{ item }}"
        state: absent
      with_items: "{{ (files.files | sort(attribute='ctime', reverse=True) | map(attribute='path')| list)[3:] }}"

Как видите, все читается, и нет ничего сложного.
Если что-то "сложное", то берем в руки питона и делаем filter_plugins.

Ребята, Вам не стыдно такое переводить?)


Структура папок:


├── README.md
├── roles
│   └── sudoers
│        ├── tasks
│        │   └── main.yml
│        ├── templates
│        │   └── sudoers.j2
│        └── vars
│             └── main.yml
└── sudoers.yml

Красиво, понятно? А у вас так же, как в источнике.
Серьезно, дали бы какому-то стажеру запустить ваш неработающий плейбук (роль).
Вместо MD5STAT.exists надо MD5STAT.stat.exists.
Халтура, одним словом.


А теперь про культуру.


shell: "grep -v '/etc/sudoers' {{ MD5FILE }} > {{ MD5FILE }}.tmp; {{ csbin }} /etc/sudoers >> {{ MD5FILE }}; mv {{ MD5FILE }}.tmp {{ MD5FILE }}"

Какой смысл переходить на декларативный язык описания, и при этом продолжать тянуть за собой вот такие паровозы?
Как такое поддерживать? Вспоминаются однострочники на перле.


Сравните:


- name: sudoers checksum
  shell: "grep -v '/etc/sudoers' {{ MD5FILE }} > {{ MD5FILE }}.tmp ; {{ csbin }} /etc/sudoers >> {{ MD5FILE }} ; mv {{ MD5FILE }}.tmp {{ MD5FILE }}"
  when: sudochg.changed or MD5STAT.exists == false

и мой вариант:


 - name: sudoers getcksum
   command: "{{ csbin }} /etc/sudoers"
   register: sudoers_crc

 - name: sudoers writecksum
   lineinfile:
     dest: "{{ MD5FILE }}"
     state: present
     regexp: " /etc/sudoers$"
     line: "{{ sudoers_crc.stdout }}"
     create: yes

И мы идем дальше.
Заметьте, там нет " when: sudochg.changed or MD5STAT.stat.exists == false". Не нужно больше.
Целых два блока, нужены лишь для одного, не допустить ошибку типа grep:: No such file or directory
И они нам теперь тоже не нужны:


   - name: "Check for checksum file"
     stat:
       path: "{{ MD5FILE }}"
     register: MD5STAT

   - name: Ensure MD5FILE 
     file:
       path: "{{ MD5FILE }}"
       owner: root
       group: "{{ sysgroup }}"
       mode: 0600
       state: touch
     when: MD5STAT.stat.exists == false

Далее, поговорим про MD5, и зачем его пишут файл.
Это делают для простоты проверки контрольных сумм. Скорее всего "некий процесс, который запускается раз в неделю и проверяет контрольную сумму файла " выглядит так:


md5sum -c ~/.sudoer.md5
exit $?

Тогда файл надо генерировать так:


md5sum /etc/sudoers >> ~/.sudoer.md5

А в плейбуке будет так:


   - name: sudoers getcksum
     stat:
       path: "/etc/sudoers"
       checksum_algorithm: md5
     register: sudoers_crc

   - name: update MD5FILE
     lineinfile:
       dest: "{{ MD5FILE }}"
       state: present
       regexp: "  /etc/sudoers$"
       line: "{{ sudoers_crc.stat.checksum }}  /etc/sudoers"
       create: yes

И два блока set_fact: теперь тоже можно удалить.

упоротых инженеров Шапки,
плевали на безопасность

Очень толсто!
Указанные вами специалисты рекомендуют SELinux в enforced режиме, и это во многом решает подобные проблемы.


[root@test ~]# useradd -u 2147483649 testuser
(Tue Dec 11 15:32:29:453761 2018) [sss_cache] [confdb_get_domains] (0x0010): No domains configured, fatal error!
Could not open available domains
useradd: sss_cache exited with status 2
useradd: Failed to flush the sssd cache.
(Tue Dec 11 15:32:29:468971 2018) [sss_cache] [confdb_get_domains] (0x0010): No domains configured, fatal error!
Could not open available domains
useradd: sss_cache exited with status 2
useradd: Failed to flush the sssd cache.

[root@test ~]# grep testuser /etc/passwd
testuser:x:2147483649:1003::/home/testuser:/bin/bash

[root@test ~]# su - testuser

[testuser@test ~]$ pwd
/home/testuser

[testuser@test ~]$ systemd-run -t /bin/bash

(pkttyagent:9334): GLib-GObject-WARNING **: 15:33:21.538: value "-2147483647" of type 'gint' is invalid or out of range for property 'uid' of type 'gint'
**
ERROR:pkttyagent.c:156:main: assertion failed: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0)
Running as unit: run-u23561.service
Press ^] three times within 1s to disconnect TTY.

[testuser@test ~]$ id
uid=2147483649(testuser) gid=1003(testuser) groups=1003(testuser) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

[testuser@test ~]$ echo hello > /test.txt
-bash: /test.txt: Permission denied

[testuser@test ~]$ rpm -q polkit
polkit-0.115-2.fc29.x86_64

[testuser@test ~]$ logout

[root@test ~]# ausearch -c '(bash)' --raw
type=AVC msg=audit(1544538801.747:9383): avc:  denied  { open } for  pid=9337 comm="(bash)" path="/dev/pts/11" dev="devpts" ino=14 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:user_devpts_t:s0 tclass=chr_file permissive=0
В DNS есть ограничение, что origin должен быть А-записью, то есть указывать на фиксированный IP-адрес.

Когда ваш сайт становится большим и вы перемещаете его на хостинг или хотите направить его на файрвол или сервис защиты от DDoS, то используете запись CNAME, чтобы направить имя хоста на другое непостоянное имя хоста, которым управляет поставщик в зависимости от вашего трафика и потребностей.

Но если сайт размещён на голом домене (example.com), вы не можете этого сделать.

Перевод-переводом, но стоит отметить, что уже не актуально, ибо есть ANAME.
Пользуемся более двух лет, все супер!
https://tools.ietf.org/html/draft-ietf-dnsop-aname-02

Information

Rating
Does not participate
Date of birth
Registered
Activity