Pull to refresh
7
0

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

Send message

https://discuss.hashicorp.com/t/access-to-releases-hashicorp-com-is-denied/36348

We’re sorry, but because of the conflict underway in Ukraine, HashiCorp is prohibiting availability of our products and services in Russia and Belarus.

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

Information

Rating
Does not participate
Date of birth
Registered
Activity