aboutsummaryrefslogtreecommitdiffstats
path: root/mayor-mod/bin/crypt-backup.sh
blob: 11e10a27a4e843edf3231473e8a4025aae364c44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/bin/bash
#
# Example: mayor crypt-backup --backup-file=/tmp/wiki.tgz
# Az eredmény a $BACKUPDIR/$DATE-crypt.tgz állományba kerül
# (Vagy jobb lenne, ha a file nevéből venné a nevét?)
#
# TODO: ellenőrizni kell még, hogy van-e openssl és aespipe
#

OPT_SPEC="hf:d::"
LONG_OPT_SPEC="help,file:,backup-file:,dir:,backup-dir::"
PARSED_OPTIONS=$(getopt -n "$0" -a -o $OPT_SPEC --long $LONG_OPT_SPEC -- "$@")
OPTIONS_RET=$?
eval set -- "$PARSED_OPTIONS"

help_usage() {
cat <<EOF

Crypt-backup használata: mayor crypt-backup [opciók]

A parancs segítségével titkosíthatjuk meglévő mentési állományunkat. Az így kapott
állomány akár nyilvános tárhelyen is tárolható, kibontásához az intézmény privát
kulcsa szükséges. 
A script alapértelmezetten az aktuális dátum alapján elnevezett mentési állományt
keres: "YYYYmmdd.tgz" alakban (pl. $DATE.tgz), ebből készít "YYYYmmdd-crypt.tgz"
nevű állományt (pl. ${DATE}-crypt.tgz).

A mentési könyvtár, a szükséges jelszavak és egyéb mentési paraméterek beállításait a 
/etc/mayor/main.conf állományban kell megadni.

Opciók:
    -h, --help:                A parancs leírása (amit most olvasol...)
    -f, --file, --backup-file: A mentési állomány neve
    -d, --dir, --backup-dir:   A mentési könyvtár elérési útja

EOF
}

#if [ $OPTIONS_RET -ne 0 ] || [ $# -le 1 ]; then  help_usage; exit; fi
if [ $OPTIONS_RET -ne 0 ]; then  help_usage; exit; fi

BACKUPFILE="$DATE"
while [ $# -ge 1 ]; do
    case $1 in
        --help | -h )                   help_usage
                                        exit
                                        ;;

        --backup-file | --file | -f )   shift
                                        BACKUPFILE="$1"
                                        echo "Backup fájl: $BACKUPFILE"
                                        ;;

        --backup-dir | --dir | -d )     shift
                                        BACKUPDIR="$1"
                                        echo "Backup könyvtár: $BACKUPDIR"
                                        ;;

        -- )                            shift
                                        break
                                        ;;

        * )                             echo "HIBA: ismeretlen opció: $1" # ide elvileg sose jutunk, mert a getopts már kiszűrte a hibás paraméterek
                                        exit
                                        ;;
    esac
    shift
done

############################

# mysql bináris ellenőrzése
if [ ! -f $MYSQL ]; then
    echo -e "\n\nERROR: A mysql kliens nem található: $MYSQL\n"
    exit 1
fi

# Login adatbázis eléréséhez szükséges paraméterek lekérdezése a konfig-ból...
DB=`grep db $BASEDIR/config/main-config.php | sed -e "s/$.*=\ *['|\"]//g" -e "s/['|\"];//g"`
USER=`grep user $BASEDIR/config/main-config.php | sed -e "s/$.*=\ *['|\"]//g" -e "s/['|\"];//g"`
PW=`grep pw $BASEDIR/config/main-config.php | sed -e "s/$.*=\ *['|\"]//g" -e "s/['|\"];//g"`

# Ellenőrizzük, hogy van-e publikus kulcs - regisztrált intézmény-e
COUNT=`$MYSQL -e 'SELECT count(publicKey) FROM mayorSsl' -p$PW -u$USER $DB | grep -i -v count`
if [ "$COUNT" -ne "1" ]; then
    echo "Publikus kulcsok száma: $COUNT"
    echo "Nem regisztrált intézmény? A mentés titkosítása csak regisztrált intézmények számára érhető el!"
    exit 2
fi

# Backup könyvtár létrehozása
if [ ! -e  $BACKUPDIR ]; then
    mkdir $BACKUPDIR > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "Nem sikerült a ${BACKUPDIR} könyvtárat létrehozni!"
        echo "MaYoR Backup failure!"
        exit 3
    fi
fi
CRYPTDIR=$BACKUPDIR/$DATE
if [ ! -e  $CRYPTDIR ]; then
    mkdir $CRYPTDIR
fi
chown $WEB_SERVER_USER $BACKUPDIR
chmod 700 $BACKUPDIR

if [ ! -f $BACKUPFILE ]; then
    # Próbáljuk meg a mai dátum szerinti backup-ot (alapértelmezés)
    echo -e "    HIBA: Hiányzik a kódolandó mentési állomámny: (${BACKUPFILE})\n"
    BACKUPFILE=$BACKUPDIR/${BACKUPFILE}
    echo "Próbáljuk a mentéi könyvtáron belül: ${BACKUPFILE}"
    if [ ! -f $BACKUPFILE ]; then
	echo -e "    HIBA: Hiányzik a kódolandó mentési állomámny: (${BACKUPFILE})\n"
	BACKUPFILE=$BACKUPDIR/${PREFIX}${DATE}.tgz
	echo "Próbáljuk az alapértelmezett állománynevet: ${BACKUPFILE}"
	if [ ! -e $BACKUPFILE ]; then
	    echo -e "    HIBA: Hiányzik a kódolandó mentési állomámny: (${BACKUPFILE})\n"
	    exit 3
	fi
    fi
fi
BASENAME=`basename $BACKUPFILE`

# Publikus kulcs lekérdezése
echo 'SELECT publicKey FROM mayorSsl' | $MYSQL -p$PW -u$USER $DB | grep -v publicKey | sed -e 's/\\n/\n/g' > $CRYPTDIR/id_rsa.pub

# Véletlen kulcs generálás a szimmetrikus AES kódoláshoz
pwgen -nc 50 1 > $CRYPTDIR/key.txt

# AES kódolás
aespipe -P $CRYPTDIR/key.txt -e aes256 < $BACKUPFILE > $CRYPTDIR/$BASENAME.aes

# A kulcsok RSA kódolása a publikus kulccsal
openssl rsautl -encrypt -inkey $CRYPTDIR/id_rsa.pub -pubin -in $CRYPTDIR/key.txt -out $CRYPTDIR/key.rsa

# Kulcsok törlése
rm $CRYPTDIR/id_rsa.pub
rm $CRYPTDIR/key.txt

cd $BACKUPDIR
tar cfz ${DATE}-crypt.tgz ${DATE}
rm -rf $DATE

echo -e "\nBecsomagolva: $BACKUPDIR/${DATE}-crypt.tgz\n\n"