How to come true the convolution with a 2-D array in frequency domain with python
This is because the identity for the convolution is
[[1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]]

You get the correct result by replacing
img_back = np.real(img_back)

by
img_back = np.fft.ifftshift(np.round(np.real(img_back)))

It is important to np.round (to the nearest integer) before casting to np.int, otherwise you will may have wrong results due to rounding errors e.g. np.array([0.999999999999]).astype(np.int) = 0
Notes about fftshift
The the fftshift and ifftshift operations are equivalent to a convolution, we could express fftshift(X) as $S * X$.
Convolutions are commutative and associative $a * (b * c) = (a * b) * c$, and $a * b = b * a$, it is immediate in the frequency from the multiplication operator properties.
Lets say $X$ is your image $H$ is your kernel
you can check that $S^{-1} * X$, or $X = S$, is precisely the term that I mentioned in the beginning of the answer is the identity for the convolution
What you have from my solution above is $S^{-1} * (H * X)$, the solution you metioned in the comments is $H * (S^{-1} * X)$, and there would be one other variation $(S^{-1} * H) * X$ that would represents calling fftshift on the kernel instead of the image. I already saw some doing ffthisft in both inputs and then ifftshift to the output.
Alternative forms...
$(S^{-1} * X) * H = X * (S^{-1} * H) = S * (S^{-1} * X) * (S^{-1} * H)$